2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.be.components.distribution.engine;
23 import com.att.aft.dme2.api.DME2Exception;
24 import com.att.aft.dme2.iterator.DME2EndpointIterator;
25 import com.att.aft.dme2.iterator.domain.DME2EndpointReference;
26 import com.att.aft.dme2.manager.registry.DME2Endpoint;
27 import com.att.nsa.apiClient.credentials.ApiCredential;
28 import com.google.common.annotations.VisibleForTesting;
29 import com.google.gson.Gson;
30 import com.google.gson.GsonBuilder;
31 import fj.data.Either;
32 import org.apache.commons.lang3.StringUtils;
33 import org.apache.http.HttpStatus;
34 import org.openecomp.sdc.be.components.distribution.engine.IDmaapNotificationData.DmaapActionEnum;
35 import org.openecomp.sdc.be.components.distribution.engine.IDmaapNotificationData.OperationaEnvironmentTypeEnum;
36 import org.openecomp.sdc.be.components.distribution.engine.report.DistributionCompleteReporter;
37 import org.openecomp.sdc.be.config.ConfigurationManager;
38 import org.openecomp.sdc.be.config.DistributionEngineConfiguration;
39 import org.openecomp.sdc.be.config.DmaapConsumerConfiguration;
40 import org.openecomp.sdc.be.config.DmeConfiguration;
41 import org.openecomp.sdc.be.dao.cassandra.CassandraOperationStatus;
42 import org.openecomp.sdc.be.dao.cassandra.OperationalEnvironmentDao;
43 import org.openecomp.sdc.be.datatypes.enums.EnvironmentStatusEnum;
44 import org.openecomp.sdc.be.impl.ComponentsUtils;
45 import org.openecomp.sdc.be.info.OperationalEnvInfo;
46 import org.openecomp.sdc.be.resources.data.OperationalEnvironmentEntry;
47 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
48 import org.openecomp.sdc.common.datastructure.Wrapper;
49 import org.openecomp.sdc.common.http.client.api.HttpResponse;
50 import org.openecomp.sdc.common.log.wrappers.Logger;
51 import org.springframework.stereotype.Service;
53 import javax.annotation.PostConstruct;
55 import java.util.concurrent.atomic.AtomicBoolean;
56 import java.util.function.Function;
57 import java.util.function.Supplier;
58 import java.util.stream.Collectors;
60 import static org.apache.commons.lang3.StringUtils.isEmpty;
61 import static org.openecomp.sdc.common.datastructure.FunctionalInterfaces.runMethodWithTimeOut;
64 * Allows to consume DMAAP topic and handle received notifications
67 public class EnvironmentsEngine implements INotificationHandler {
69 private static final String MESSAGE_BUS = "MessageBus";
70 private static final String UNKNOWN = "Unknown";
71 private static final Logger log = Logger.getLogger(EnvironmentsEngine.class.getName());
72 private ConfigurationManager configurationManager = ConfigurationManager.getConfigurationManager();
74 private Map<String, OperationalEnvironmentEntry> environments = new HashMap<>();
75 private Map<String, AtomicBoolean> envNamePerStatus = new HashMap<>();
76 private Map<String, DistributionEnginePollingTask> envNamePerPollingTask = new HashMap<>();
77 private Map<String, DistributionEngineInitTask> envNamePerInitTask = new HashMap<>();
79 private final DmaapConsumer dmaapConsumer;
80 private final OperationalEnvironmentDao operationalEnvironmentDao;
81 private final DME2EndpointIteratorCreator epIterCreator;
82 private final AaiRequestHandler aaiRequestHandler;
83 private final ComponentsUtils componentUtils;
84 private final CambriaHandler cambriaHandler;
85 private final DistributionEngineClusterHealth distributionEngineClusterHealth;
86 private final DistributionCompleteReporter distributionCompleteReporter;
88 public EnvironmentsEngine(DmaapConsumer dmaapConsumer, OperationalEnvironmentDao operationalEnvironmentDao, DME2EndpointIteratorCreator epIterCreator, AaiRequestHandler aaiRequestHandler, ComponentsUtils componentUtils, CambriaHandler cambriaHandler, DistributionEngineClusterHealth distributionEngineClusterHealth, DistributionCompleteReporter distributionCompleteReporter) {
89 this.dmaapConsumer = dmaapConsumer;
90 this.operationalEnvironmentDao = operationalEnvironmentDao;
91 this.epIterCreator = epIterCreator;
92 this.aaiRequestHandler = aaiRequestHandler;
93 this.componentUtils = componentUtils;
94 this.cambriaHandler = cambriaHandler;
95 this.distributionEngineClusterHealth = distributionEngineClusterHealth;
96 this.distributionCompleteReporter = distributionCompleteReporter;
103 environments = populateEnvironments();
104 createUebTopicsForEnvironments();
105 initDmeGlobalConfig();
106 if(!configurationManager.getConfiguration().getDmaapConsumerConfiguration().isActive()){
107 log.info("Environments engine is disabled");
110 dmaapConsumer.consumeDmaapTopic(this::handleMessage,
111 (t, e) -> log.error("An error occurred upon consuming topic by Dmaap consumer client: ", e));
112 log.info("Environments engine has been initialized.");
113 } catch (Exception e) {
114 log.error("An error occurred upon consuming topic by Dmaap consumer client.", e);
118 private void initDmeGlobalConfig() {
119 DmaapConsumerConfiguration dmaapConsumerParams = ConfigurationManager.getConfigurationManager().getConfiguration().getDmaapConsumerConfiguration();
120 if (dmaapConsumerParams == null) {
121 log.warn("cannot read dmaap configuration file,DME might not be initialized properly");
124 System.setProperty("AFT_ENVIRONMENT", dmaapConsumerParams.getEnvironment()); // AFTPRD for production
125 System.setProperty("AFT_LATITUDE", dmaapConsumerParams.getLatitude()!=null ? dmaapConsumerParams.getLatitude().toString() : "1.0"); // Replace with actual latitude
126 System.setProperty("AFT_LONGITUDE", dmaapConsumerParams.getLongitude()!=null ? dmaapConsumerParams.getLongitude().toString() : "1.0"); // Replace with actual longitude
129 public void connectUebTopicTenantIsolation(OperationalEnvironmentEntry opEnvEntry,
130 AtomicBoolean status,
131 Map<String, DistributionEngineInitTask> envNamePerInitTask, Map<String, DistributionEnginePollingTask> envNamePerPollingTask) {
132 connectUebTopic(opEnvEntry, status, envNamePerInitTask, envNamePerPollingTask);
136 public void connectUebTopicForDistributionConfTopic(String envName,
137 AtomicBoolean status,
138 Map<String, DistributionEngineInitTask> envNamePerInitTask, Map<String, DistributionEnginePollingTask> envNamePerPollingTask) {
139 connectUebTopic(environments.get(envName), status, envNamePerInitTask, envNamePerPollingTask);
144 * Allows to create and run UEB initializing and polling tasks
147 * @param envNamePerInitTask
148 * @param envNamePerPollingTask
151 private void connectUebTopic(OperationalEnvironmentEntry opEnvEntry, AtomicBoolean status,
152 Map<String, DistributionEngineInitTask> envNamePerInitTask,
153 Map<String, DistributionEnginePollingTask> envNamePerPollingTask) {
155 String envId = opEnvEntry.getEnvironmentId();
157 DistributionEngineConfiguration distributionEngineConfiguration = ConfigurationManager.getConfigurationManager()
158 .getDistributionEngineConfiguration();
159 DistributionEnginePollingTask distributionEnginePollingTask = new DistributionEnginePollingTask(
160 distributionEngineConfiguration, distributionCompleteReporter, componentUtils, distributionEngineClusterHealth,
162 String envName = configurationManager.getDistributionEngineConfiguration().getEnvironments().get(0);
163 DistributionEngineInitTask distributionEngineInitTask = new DistributionEngineInitTask(0l,
164 distributionEngineConfiguration, envName, status, componentUtils, distributionEnginePollingTask,
166 distributionEngineInitTask.startTask();
167 envNamePerInitTask.put(envId, distributionEngineInitTask);
168 envNamePerPollingTask.put(envId, distributionEnginePollingTask);
170 log.debug("Environment envId = {} has been connected to the UEB topic", envId);
174 public boolean handleMessage(String notification) {
175 DmaapConsumerConfiguration dmaapConsumerParams = ConfigurationManager.getConfigurationManager()
176 .getConfiguration().getDmaapConsumerConfiguration();
177 Supplier<Boolean> supplier = () -> handleMessageLogic(notification);
178 Either<Boolean, Boolean> eitherTimeOut = runMethodWithTimeOut(supplier,
179 dmaapConsumerParams.getTimeLimitForNotificationHandleMs());
182 if (eitherTimeOut.isRight()) {
185 result = eitherTimeOut.left().value();
190 public boolean handleMessageLogic(String notification) {
191 Wrapper<Boolean> errorWrapper = new Wrapper<>();
192 Wrapper<OperationalEnvironmentEntry> opEnvEntryWrapper = new Wrapper<>();
195 log.debug("handle message - for operational environment notification received: {}", notification);
196 Gson gsonObj = new GsonBuilder().create();
198 IDmaapNotificationData notificationData = gsonObj.fromJson(notification,
199 DmaapNotificationDataImpl.class);
200 IDmaapAuditNotificationData auditNotificationData = gsonObj.fromJson(notification,
201 DmaapNotificationDataImpl.class);
203 AuditingActionEnum actionEnum;
204 switch (notificationData.getAction()) {
206 actionEnum = AuditingActionEnum.CREATE_ENVIRONMENT;
209 actionEnum = AuditingActionEnum.UPDATE_ENVIRONMENT;
212 actionEnum = AuditingActionEnum.DELETE_ENVIRONMENT;
215 actionEnum = AuditingActionEnum.UNKNOWN_ENVIRONMENT_NOTIFICATION;
218 componentUtils.auditEnvironmentEngine(actionEnum,
219 notificationData.getOperationalEnvironmentId(), notificationData.getOperationalEnvironmentType().getEventTypenName(),
220 notificationData.getAction().getActionName(), auditNotificationData.getOperationalEnvironmentName(),
221 auditNotificationData.getTenantContext());
223 if (errorWrapper.isEmpty()) {
224 validateNotification(errorWrapper, notificationData, auditNotificationData);
226 // Perform Save In-Progress Dao
227 if (errorWrapper.isEmpty()) {
228 saveEntryWithInProgressStatus(errorWrapper, opEnvEntryWrapper, notificationData);
231 if (errorWrapper.isEmpty()) {
232 buildOpEnv(errorWrapper, opEnvEntryWrapper.getInnerElement());
235 } catch (Exception e) {
236 log.debug("handle message for operational environmet failed for notification: {} with error :{}",
237 notification, e.getMessage(), e);
238 errorWrapper.setInnerElement(false);
241 return errorWrapper.isEmpty();
244 private void validateNotification(Wrapper<Boolean> errorWrapper, IDmaapNotificationData notificationData,
245 IDmaapAuditNotificationData auditNotificationData) {
246 // Check OperationaEnvironmentType
247 if (errorWrapper.isEmpty()) {
248 validateEnvironmentType(errorWrapper, notificationData, auditNotificationData);
251 if (errorWrapper.isEmpty()) {
252 validateActionType(errorWrapper, notificationData);
254 // Check is valid for create/update (not In-Progress state)
255 if (errorWrapper.isEmpty()) {
256 validateState(errorWrapper, notificationData);
260 public void buildOpEnv(Wrapper<Boolean> errorWrapper, OperationalEnvironmentEntry opEnvEntry) {
261 // Get Env Info From A&AI
262 if (errorWrapper.isEmpty()) {
263 retrieveOpEnvInfoFromAAI(errorWrapper, opEnvEntry);
266 if (errorWrapper.isEmpty()) {
267 // Get List Of UEB Addresses From AFT_DME
268 retrieveUebAddressesFromAftDme(errorWrapper, opEnvEntry);
271 // Create UEB keys and set them on EnvEntry
272 if (errorWrapper.isEmpty()) {
273 createUebKeys(errorWrapper, opEnvEntry);
277 if (errorWrapper.isEmpty()) {
278 log.debug("handle message - Create Topics");
279 createUebTopicsForEnvironment(opEnvEntry);
282 // Save Status Complete and Add to Map
283 if (errorWrapper.isEmpty()) {
284 saveEntryWithCompleteStatus(errorWrapper, opEnvEntry);
287 // Update Environments Map
288 if (errorWrapper.isEmpty()) {
289 environments.put(opEnvEntry.getEnvironmentId(), opEnvEntry);
291 saveEntryWithFailedStatus(errorWrapper, opEnvEntry);
295 private void saveEntryWithFailedStatus(Wrapper<Boolean> errorWrapper, OperationalEnvironmentEntry opEnvEntry) {
296 log.debug("handle message - save OperationalEnvironment Failed Status");
297 opEnvEntry.setStatus(EnvironmentStatusEnum.FAILED);
298 saveOpEnvEntry(errorWrapper, opEnvEntry);
301 void saveEntryWithCompleteStatus(Wrapper<Boolean> errorWrapper, OperationalEnvironmentEntry opEnvEntry) {
302 log.debug("handle message - save OperationalEnvironment Complete Dao");
303 opEnvEntry.setStatus(EnvironmentStatusEnum.COMPLETED);
304 saveOpEnvEntry(errorWrapper, opEnvEntry);
308 void retrieveUebAddressesFromAftDme(Wrapper<Boolean> errorWrapper, OperationalEnvironmentEntry opEnvEntry) {
309 log.debug("handle message - Get List Of UEB Addresses From AFT_DME");
311 boolean isKeyFieldsValid = !isEmpty(opEnvEntry.getTenant()) && !isEmpty(opEnvEntry.getEcompWorkloadContext());
312 if (isKeyFieldsValid) {
313 String opEnvKey = map2OpEnvKey(opEnvEntry);
314 String environmentId = opEnvEntry.getEnvironmentId();
315 List<String> uebHosts = discoverUebHosts(opEnvKey, environmentId);
316 opEnvEntry.setDmaapUebAddress(uebHosts.stream().collect(Collectors.toSet()));
318 errorWrapper.setInnerElement(false);
319 log.debug("Can Not Build AFT DME Key from workLoad & Tenant Fields.");
322 } catch (DME2Exception e) {
323 errorWrapper.setInnerElement(false);
324 log.error("Failed to retrieve Ueb Addresses From DME. ", e);
328 void createUebKeys(Wrapper<Boolean> errorWrapper, OperationalEnvironmentEntry opEnvEntry) {
329 log.debug("handle message - Create UEB keys");
330 List<String> discoverEndPoints = opEnvEntry.getDmaapUebAddress().stream()
331 .collect(Collectors.toList());
332 Either<ApiCredential, CambriaErrorResponse> eitherCreateUebKeys = cambriaHandler
333 .createUebKeys(discoverEndPoints);
334 if (eitherCreateUebKeys.isRight()) {
335 errorWrapper.setInnerElement(false);
336 log.debug("handle message - failed to create UEB Keys");
338 ApiCredential apiCredential = eitherCreateUebKeys.left().value();
339 opEnvEntry.setUebApikey(apiCredential.getApiKey());
340 opEnvEntry.setUebSecretKey(apiCredential.getApiSecret());
344 void retrieveOpEnvInfoFromAAI(Wrapper<Boolean> errorWrapper, OperationalEnvironmentEntry opEnvEntry) {
345 log.debug("handle message - Get Env Info From A&AI");
346 Either<OperationalEnvInfo, Integer> eitherOperationalEnvInfo = getOperationalEnvById(
347 opEnvEntry.getEnvironmentId());
348 if (eitherOperationalEnvInfo.isRight()) {
349 errorWrapper.setInnerElement(false);
350 log.debug("handle message - failed to retrieve details from A&AI");
352 OperationalEnvInfo operationalEnvInfo = eitherOperationalEnvInfo.left().value();
353 opEnvEntry.setEcompWorkloadContext(operationalEnvInfo.getWorkloadContext());
354 opEnvEntry.setTenant(operationalEnvInfo.getTenantContext());
358 void saveEntryWithInProgressStatus(Wrapper<Boolean> errorWrapper, Wrapper<OperationalEnvironmentEntry> opEnvEntryWrapper, IDmaapNotificationData notificationData) {
359 log.debug("handle message - save OperationalEnvironment In-Progress Dao");
360 OperationalEnvironmentEntry opEnvEntry = new OperationalEnvironmentEntry();
361 // Entry Environment ID holds actually the environment NAME
362 opEnvEntry.setEnvironmentId(notificationData.getOperationalEnvironmentId());
363 opEnvEntry.setStatus(EnvironmentStatusEnum.IN_PROGRESS);
364 opEnvEntry.setIsProduction(false);
365 saveOpEnvEntry(errorWrapper, opEnvEntry);
366 opEnvEntryWrapper.setInnerElement(opEnvEntry);
371 void validateState(Wrapper<Boolean> errorWrapper, IDmaapNotificationData notificationData) {
372 log.debug("handle message - verify OperationalEnvironment not In-Progress");
373 String opEnvId = notificationData.getOperationalEnvironmentId();
375 Either<OperationalEnvironmentEntry, CassandraOperationStatus> eitherOpEnv = operationalEnvironmentDao
377 if (eitherOpEnv.isLeft()) {
378 final OperationalEnvironmentEntry opEnvEntry = eitherOpEnv.left().value();
379 if (StringUtils.equals(opEnvEntry.getStatus(), EnvironmentStatusEnum.IN_PROGRESS.getName())) {
380 errorWrapper.setInnerElement(false);
381 log.debug("handle message - validate State Failed Record Found With Status : {} Flow Stopped!", opEnvEntry.getStatus());
384 CassandraOperationStatus operationStatus = eitherOpEnv.right().value();
385 if (operationStatus != CassandraOperationStatus.NOT_FOUND) {
386 errorWrapper.setInnerElement(false);
387 log.debug("failed to retrieve operationa environment with id:{} cassandra error was :{}", opEnvId,
394 void validateActionType(Wrapper<Boolean> errorWrapper, IDmaapNotificationData notificationData) {
395 log.debug("handle message - verify Action Type");
396 DmaapActionEnum action = notificationData.getAction();
397 if (action == DmaapActionEnum.DELETE) {
398 errorWrapper.setInnerElement(false);
399 log.debug("handle message - validate Action Type Failed With Action Type: {} Flow Stopped!", action);
403 void validateEnvironmentType(Wrapper<Boolean> errorWrapper, IDmaapNotificationData notificationData,
404 IDmaapAuditNotificationData auditNotificationData) {
405 log.debug("handle message - verify OperationaEnvironmentType");
406 OperationaEnvironmentTypeEnum envType = notificationData.getOperationalEnvironmentType();
407 if (envType != OperationaEnvironmentTypeEnum.ECOMP) {
408 errorWrapper.setInnerElement(false);
409 log.debug("handle message - validate Environment Type Failed With Environment Type: {} Flow Stopped!", envType);
410 componentUtils.auditEnvironmentEngine(AuditingActionEnum.UNSUPPORTED_ENVIRONMENT_TYPE,
411 notificationData.getOperationalEnvironmentId(), notificationData.getOperationalEnvironmentType().getEventTypenName(),
412 notificationData.getAction().getActionName(), auditNotificationData.getOperationalEnvironmentName(),
413 auditNotificationData.getTenantContext());
418 private void saveOpEnvEntry(Wrapper<Boolean> errorWrapper, OperationalEnvironmentEntry entry) {
419 entry.setLastModified(new Date(System.currentTimeMillis()));
420 CassandraOperationStatus saveStaus = operationalEnvironmentDao.save(entry);
421 if (saveStaus != CassandraOperationStatus.OK) {
422 errorWrapper.setInnerElement(false);
423 log.debug("handle message saving operational environmet failed for id :{} with error : {}",
424 entry.getEnvironmentId(), saveStaus);
428 public List<String> discoverUebHosts(String opEnvKey, String env) throws DME2Exception {
429 DmeConfiguration dmeConfiguration = configurationManager.getConfiguration().getDmeConfiguration();
430 List<String> uebHosts = new LinkedList<>();
432 String lookupURI = String.format("http://%s/service=%s/version=1.0.0/envContext=%s/partner=*", dmeConfiguration.getDme2Search(), opEnvKey,
434 DME2EndpointIterator iterator = epIterCreator.create(lookupURI);
436 // Beginning iteration
437 while (iterator.hasNext()) {
438 DME2EndpointReference ref = iterator.next();
439 DME2Endpoint dmeEndpoint = ref.getEndpoint();
440 log.debug("DME returns EP with UEB host {}, UEB port: {}", dmeEndpoint.getHost(), dmeEndpoint.getPort());
441 uebHosts.add(dmeEndpoint.getHost());
447 private String map2OpEnvKey(OperationalEnvironmentEntry entry) {
448 return String.format("%s.%s.%s", entry.getTenant(), entry.getEcompWorkloadContext(), MESSAGE_BUS);
451 private Map<String, OperationalEnvironmentEntry> populateEnvironments() {
452 Map<String, OperationalEnvironmentEntry> envs = getEnvironmentsFromDb();
453 OperationalEnvironmentEntry confEntry = readEnvFromConfig();
454 envs.put(confEntry.getEnvironmentId(), confEntry);
458 private OperationalEnvironmentEntry readEnvFromConfig() {
459 OperationalEnvironmentEntry entry = new OperationalEnvironmentEntry();
460 DistributionEngineConfiguration distributionEngineConfiguration = configurationManager
461 .getDistributionEngineConfiguration();
462 entry.setUebApikey(distributionEngineConfiguration.getUebPublicKey());
463 entry.setUebSecretKey(distributionEngineConfiguration.getUebSecretKey());
465 Set<String> puebEndpoints = new HashSet<>();
466 puebEndpoints.addAll(distributionEngineConfiguration.getUebServers());
467 entry.setDmaapUebAddress(puebEndpoints);
469 String envName = distributionEngineConfiguration.getEnvironments().size() == 1
470 ? distributionEngineConfiguration.getEnvironments().get(0) : UNKNOWN;
471 entry.setEnvironmentId(envName);
473 if (log.isDebugEnabled()) {
474 log.debug("Enviroment read from configuration: {}", entry);
480 private Map<String, OperationalEnvironmentEntry> getEnvironmentsFromDb() {
481 Either<List<OperationalEnvironmentEntry>, CassandraOperationStatus> opEnvResult = operationalEnvironmentDao
482 .getByEnvironmentsStatus(EnvironmentStatusEnum.COMPLETED);
484 if (opEnvResult.isLeft()) {
485 Map<String, OperationalEnvironmentEntry> resultMap = opEnvResult.left().value().stream()
486 .collect(Collectors.toMap(OperationalEnvironmentEntry::getEnvironmentId, Function.identity()));
487 resultMap.forEach((key, value) -> log.debug("Enviroment loaded from DB: {}", value));
490 CassandraOperationStatus status = opEnvResult.right().value();
491 log.debug("Failed to populate Operation Envirenments Map from Cassandra, DB status: {}", status);
492 return new HashMap<>();
496 void createUebTopicsForEnvironments() {
497 environments.values().forEach(this::createUebTopicsForEnvironment);
500 public void createUebTopicsForEnvironment(OperationalEnvironmentEntry opEnvEntry) {
501 String envId = opEnvEntry.getEnvironmentId();
502 log.debug("Create Environment {} on UEB Topic.", envId);
503 AtomicBoolean status = new AtomicBoolean(false);
504 envNamePerStatus.put(envId, status);
506 connectUebTopicTenantIsolation(opEnvEntry, status, envNamePerInitTask, envNamePerPollingTask);
510 void setConfigurationManager(ConfigurationManager configurationManager) {
511 this.configurationManager = configurationManager;
514 public Map<String, OperationalEnvironmentEntry> getEnvironments() {
519 public Either<OperationalEnvInfo, Integer> getOperationalEnvById(String id) {
520 HttpResponse<String> resp = aaiRequestHandler.getOperationalEnvById(id);
521 if (resp.getStatusCode() == HttpStatus.SC_OK) {
523 OperationalEnvInfo operationalEnvInfo = OperationalEnvInfo.createFromJson(resp.getResponse());
525 log.debug("Get \"{}\" operational environment. {}", id, operationalEnvInfo);
526 return Either.left(operationalEnvInfo);
527 } catch (Exception e) {
528 log.debug("Json convert to OperationalEnvInfo failed with exception ", e);
529 return Either.right(HttpStatus.SC_INTERNAL_SERVER_ERROR);
532 log.debug("Get \"{}\" operational environment failed with statusCode: {}, description: {}", id,
533 resp.getStatusCode(), resp.getDescription());
534 return Either.right(resp.getStatusCode());
538 public OperationalEnvironmentEntry getEnvironmentById(String envId) {
539 return environments.get(envId);
542 public boolean isInMap(OperationalEnvironmentEntry env) {
543 return isInMap(env.getEnvironmentId());
546 public boolean isInMap(String envId) {
547 return environments.containsKey(envId);
550 public void addToMap(OperationalEnvironmentEntry opEnvEntry) {
551 environments.put(opEnvEntry.getEnvironmentId(), opEnvEntry);