blob: 3d7b44a6d61ee564b72015f3307a59e697ea2c8f [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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.airavata.drms.api.handlers;
import com.google.protobuf.Empty;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.stub.StreamObserver;
import org.apache.airavata.datalake.drms.DRMSServiceAuthToken;
import org.apache.airavata.datalake.drms.groups.FetchCurrentUserRequest;
import org.apache.airavata.datalake.drms.groups.FetchCurrentUserResponse;
import org.apache.airavata.datalake.drms.groups.GroupServiceGrpc;
import org.apache.airavata.datalake.drms.groups.User;
import org.apache.airavata.datalake.drms.storage.*;
import org.apache.airavata.drms.core.Neo4JConnector;
import org.apache.airavata.drms.core.deserializer.AnyStorageDeserializer;
import org.apache.airavata.drms.core.deserializer.AnyStoragePreferenceDeserializer;
import org.lognet.springboot.grpc.GRpcService;
import org.neo4j.driver.Record;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
@GRpcService
public class StoragePreferenceServiceHandler extends StoragePreferenceServiceGrpc.StoragePreferenceServiceImplBase {
private static final Logger logger = LoggerFactory.getLogger(StoragePreferenceServiceHandler.class);
@Autowired
private Neo4JConnector neo4JConnector;
@org.springframework.beans.factory.annotation.Value("${group.service.host}")
private String groupServiceHost;
@org.springframework.beans.factory.annotation.Value("${group.service.port}")
private int groupServicePort;
private User getUser(DRMSServiceAuthToken authToken) {
ManagedChannel channel = ManagedChannelBuilder.forAddress(groupServiceHost, groupServicePort).usePlaintext().build();
GroupServiceGrpc.GroupServiceBlockingStub groupClient = GroupServiceGrpc.newBlockingStub(channel);
FetchCurrentUserResponse userResponse = groupClient.fetchCurrentUser(
FetchCurrentUserRequest.newBuilder().setAuthToken(authToken).build());
return userResponse.getUser();
}
@Override
public void fetchStoragePreference(StoragePreferenceFetchRequest request, StreamObserver<StoragePreferenceFetchResponse> responseObserver) {
User callUser = getUser(request.getAuthToken());
List<Record> records = this.neo4JConnector.searchNodes(
"MATCH (u:User)-[r1:MEMBER_OF]->(g:Group)<-[r2:SHARED_WITH]-(s:Storage)-[r3:HAS_PREFERENCE]->(sp:StoragePreference) " +
"where sp.storagePreferenceId = '" + request.getStoragePreferenceId() + "' and u.userId = '"
+ callUser.getUserId() + "' return distinct sp, s");
if (!records.isEmpty()) {
try {
List<AnyStoragePreference> storagePrefList = AnyStoragePreferenceDeserializer.deserializeList(records);
responseObserver.onNext(StoragePreferenceFetchResponse.newBuilder().setStoragePreference(
storagePrefList.get(0)).build());
responseObserver.onCompleted();
} catch (Exception e) {
logger.error("Errored while fetching storage preference with id {}", request.getStoragePreferenceId(), e);
responseObserver.onError(new Exception("Errored while fetching storage preference with id "
+ request.getStoragePreferenceId() + ". Msg " + e.getMessage()));
}
} else {
logger.error("Could not find a storage preference with id {}", request.getStoragePreferenceId());
responseObserver.onError(new Exception("Could not find a storage preference with id "
+ request.getStoragePreferenceId()));
}
}
@Override
public void createStoragePreference(StoragePreferenceCreateRequest request, StreamObserver<StoragePreferenceCreateResponse> responseObserver) {
super.createStoragePreference(request, responseObserver);
}
@Override
public void updateStoragePreference(StoragePreferenceUpdateRequest request, StreamObserver<StoragePreferenceUpdateResponse> responseObserver) {
super.updateStoragePreference(request, responseObserver);
}
@Override
public void deletePreferenceStorage(StoragePreferenceDeleteRequest request, StreamObserver<Empty> responseObserver) {
super.deletePreferenceStorage(request, responseObserver);
}
@Override
public void searchStoragePreference(StoragePreferenceSearchRequest request, StreamObserver<StoragePreferenceSearchResponse> responseObserver) {
User callUser = getUser(request.getAuthToken());
List<Record> records = this.neo4JConnector.searchNodes(
"MATCH (u:User)-[r1:MEMBER_OF]->(g:Group)<-[r2:SHARED_WITH]-(s:Storage)-[r3:HAS_PREFERENCE]->(sp:StoragePreference)" +
" where u.userId ='" + callUser.getUserId() + "' return distinct sp, s");
try {
List<AnyStoragePreference> storagePrefList = AnyStoragePreferenceDeserializer.deserializeList(records);
StoragePreferenceSearchResponse.Builder builder = StoragePreferenceSearchResponse.newBuilder();
builder.addAllStoragesPreference(storagePrefList);
responseObserver.onNext(builder.build());
responseObserver.onCompleted();
} catch (Exception e) {
logger.error("Errored while searching storage preferences; Message: {}", e.getMessage(), e);
responseObserver.onError(e);
}
}
}