blob: 65b72502c67667808ab6dbd36e7e6fadfecd2344 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.ozone.csi;
import java.io.IOException;
import org.apache.hadoop.ozone.client.OzoneClient;
import csi.v1.ControllerGrpc.ControllerImplBase;
import csi.v1.Csi.CapacityRange;
import csi.v1.Csi.ControllerGetCapabilitiesRequest;
import csi.v1.Csi.ControllerGetCapabilitiesResponse;
import csi.v1.Csi.ControllerServiceCapability;
import csi.v1.Csi.ControllerServiceCapability.RPC;
import csi.v1.Csi.ControllerServiceCapability.RPC.Type;
import csi.v1.Csi.CreateVolumeRequest;
import csi.v1.Csi.CreateVolumeResponse;
import csi.v1.Csi.DeleteVolumeRequest;
import csi.v1.Csi.DeleteVolumeResponse;
import csi.v1.Csi.Volume;
import io.grpc.stub.StreamObserver;
/**
* CSI controller service.
* <p>
* This service usually runs only once and responsible for the creation of
* the volume.
*/
public class ControllerService extends ControllerImplBase {
private final String volumeOwner;
private long defaultVolumeSize;
private OzoneClient ozoneClient;
public ControllerService(OzoneClient ozoneClient, long volumeSize,
String volumeOwner) {
this.volumeOwner = volumeOwner;
this.defaultVolumeSize = volumeSize;
this.ozoneClient = ozoneClient;
}
@Override
public void createVolume(CreateVolumeRequest request,
StreamObserver<CreateVolumeResponse> responseObserver) {
try {
ozoneClient.getObjectStore()
.createS3Bucket(volumeOwner, request.getName());
long size = findSize(request.getCapacityRange());
CreateVolumeResponse response = CreateVolumeResponse.newBuilder()
.setVolume(Volume.newBuilder()
.setVolumeId(request.getName())
.setCapacityBytes(size))
.build();
responseObserver.onNext(response);
responseObserver.onCompleted();
} catch (IOException e) {
responseObserver.onError(e);
}
}
private long findSize(CapacityRange capacityRange) {
if (capacityRange.getRequiredBytes() != 0) {
return capacityRange.getRequiredBytes();
} else {
if (capacityRange.getLimitBytes() != 0) {
return Math.min(defaultVolumeSize, capacityRange.getLimitBytes());
} else {
//~1 gig
return defaultVolumeSize;
}
}
}
@Override
public void deleteVolume(DeleteVolumeRequest request,
StreamObserver<DeleteVolumeResponse> responseObserver) {
try {
ozoneClient.getObjectStore().deleteS3Bucket(request.getVolumeId());
DeleteVolumeResponse response = DeleteVolumeResponse.newBuilder()
.build();
responseObserver.onNext(response);
responseObserver.onCompleted();
} catch (IOException e) {
responseObserver.onError(e);
}
}
@Override
public void controllerGetCapabilities(
ControllerGetCapabilitiesRequest request,
StreamObserver<ControllerGetCapabilitiesResponse> responseObserver) {
ControllerGetCapabilitiesResponse response =
ControllerGetCapabilitiesResponse.newBuilder()
.addCapabilities(
ControllerServiceCapability.newBuilder().setRpc(
RPC.newBuilder().setType(Type.CREATE_DELETE_VOLUME)))
.build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}