blob: 5ba4c803d73063594830ead5a1d848ef4f9dd9c2 [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 com.epam.dlab.backendapi.dao;
import com.epam.dlab.backendapi.domain.OdahuDTO;
import com.epam.dlab.backendapi.domain.OdahuFieldsDTO;
import com.epam.dlab.backendapi.domain.ProjectDTO;
import com.epam.dlab.dto.ResourceURL;
import com.epam.dlab.dto.UserInstanceStatus;
import com.epam.dlab.dto.base.odahu.OdahuResult;
import com.fasterxml.jackson.core.type.TypeReference;
import com.mongodb.BasicDBObject;
import com.mongodb.client.result.UpdateResult;
import org.bson.Document;
import org.bson.conversions.Bson;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import static com.mongodb.client.model.Filters.and;
import static com.mongodb.client.model.Filters.eq;
import static com.mongodb.client.model.Projections.elemMatch;
import static com.mongodb.client.model.Projections.excludeId;
import static com.mongodb.client.model.Projections.fields;
import static com.mongodb.client.model.Projections.include;
import static com.mongodb.client.model.Updates.push;
import static java.util.stream.Collectors.toList;
public class OdahuDAOImpl extends BaseDAO implements OdahuDAO {
private static final String PROJECTS_COLLECTION = "Projects";
private static final String ENDPOINTS = "endpoints";
private static final String ODAHU_FIELD = "odahu";
private static final String NAME_FIELD = "name";
private static final String ENDPOINT_FIELD = "endpoint";
private static final String PROJECT_FIELD = "project";
private static final String STATUS_FIELD = "status";
private static final String GRAFANA_ADMIN_FIELD = "grafana_admin";
private static final String GRAFANA_PASSWORD_FIELD = "grafana_pass";
private static final String OAUTH_COOKIE_SECRET_FIELD = "oauth_cookie_secret";
private static final String DECRYPT_TOKEN_FIELD = "odahuflow_connection_decrypt_token";
private static final String URLS_FIELD = "urls";
private static final String COMPUTATIONAL_URL_DESC = "description";
private static final String COMPUTATIONAL_URL_URL = "url";
@Override
public Optional<OdahuDTO> getByProjectEndpoint(String project, String endpoint) {
Optional<ProjectDTO> projectDTO = findOne(PROJECTS_COLLECTION, odahuProjectEndpointCondition(project, endpoint),
fields(include(ODAHU_FIELD), excludeId()),
ProjectDTO.class);
return projectDTO.flatMap(p -> p.getOdahu()
.stream()
.filter(odahu -> project.equals(odahu.getProject()) && endpoint.equals(odahu.getEndpoint()))
.findAny());
}
@Override
public OdahuFieldsDTO getFields(String name, String project, String endpoint) {
Optional<Document> one = findOne(PROJECTS_COLLECTION, odahuProjectEndpointCondition(name, project, endpoint),
fields(include(ODAHU_FIELD), excludeId()));
OdahuFieldsDTO odahuFields = null;
if (one.isPresent()) {
List<OdahuFieldsDTO> list = convertFromDocument(one.get().get(ODAHU_FIELD, ArrayList.class), new TypeReference<List<OdahuFieldsDTO>>() {
});
odahuFields = list.get(0);
}
return odahuFields;
}
@Override
public List<OdahuDTO> findOdahuClusters() {
List<ProjectDTO> projectDTOS = find(PROJECTS_COLLECTION, ProjectDTO.class);
return projectDTOS.stream()
.map(ProjectDTO::getOdahu)
.flatMap(List::stream)
.collect(toList());
}
@Override
public boolean create(OdahuDTO odahuDTO) {
UpdateResult updateResult = updateOne(PROJECTS_COLLECTION, projectEndpointCondition(odahuDTO.getProject(),
odahuDTO.getEndpoint()),
push(ODAHU_FIELD, convertToBson(odahuDTO)));
return updateResult.getModifiedCount() > 0;
}
@Override
public void updateStatus(String name, String project, String endpoint, UserInstanceStatus status) {
BasicDBObject dbObject = new BasicDBObject();
dbObject.put(ODAHU_FIELD + ".$." + STATUS_FIELD, status.name());
updateOne(PROJECTS_COLLECTION, and(elemMatch(ODAHU_FIELD, eq(NAME_FIELD, name)),
odahuProjectEndpointCondition(project, endpoint)), new Document(SET, dbObject));
}
@Override
public void updateStatusAndUrls(OdahuResult result, UserInstanceStatus status) {
BasicDBObject dbObject = new BasicDBObject();
dbObject.put(ODAHU_FIELD + ".$." + STATUS_FIELD, status.name());
dbObject.put(ODAHU_FIELD + ".$." + URLS_FIELD, getResourceUrlData(result.getResourceUrls()));
dbObject.put(ODAHU_FIELD + ".$." + GRAFANA_ADMIN_FIELD, result.getGrafanaAdmin());
dbObject.put(ODAHU_FIELD + ".$." + GRAFANA_PASSWORD_FIELD, result.getGrafanaPassword());
dbObject.put(ODAHU_FIELD + ".$." + OAUTH_COOKIE_SECRET_FIELD, result.getOauthCookieSecret());
dbObject.put(ODAHU_FIELD + ".$." + DECRYPT_TOKEN_FIELD, result.getDecryptToken());
updateOne(PROJECTS_COLLECTION, odahuProjectEndpointCondition(result.getName(), result.getProjectName(), result.getEndpointName()),
new Document(SET, dbObject));
}
private Bson odahuProjectEndpointCondition(String name, String projectName, String endpointName) {
return and(elemMatch(ODAHU_FIELD, eq(NAME_FIELD, name)), odahuProjectEndpointCondition(projectName, endpointName));
}
private Bson odahuProjectEndpointCondition(String projectName, String endpointName) {
return elemMatch(ODAHU_FIELD, and(eq(ENDPOINT_FIELD, endpointName), eq(PROJECT_FIELD, projectName)));
}
private Bson projectEndpointCondition(String projectName, String endpointName) {
return and(eq(NAME_FIELD, projectName), and(elemMatch(ENDPOINTS, eq(NAME_FIELD, endpointName))));
}
private List<Map<String, String>> getResourceUrlData(List<ResourceURL> urls) {
return urls.stream()
.map(this::toUrlDocument)
.collect(toList());
}
private LinkedHashMap<String, String> toUrlDocument(ResourceURL url) {
LinkedHashMap<String, String> map = new LinkedHashMap<>();
map.put(COMPUTATIONAL_URL_URL, url.getUrl());
map.put(COMPUTATIONAL_URL_DESC, url.getDescription());
return map;
}
}