/* * Copyright (c) 2013 EMC Corporation * All Rights Reserved */ package com.emc.storageos.services; import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component; /** * Class that holds list of services that are available for control node and extra node. * Provides static methods to retrieve these services. */ @Component public class ServicesMetadata implements InitializingBean { private static volatile Map<String, ServiceMetadata> _serviceMetadataMap = null; private static volatile Map<String, RoleMetadata> _roleMetadataMap = null; private static volatile Map<String, List<String>> _roleServiceIndex = null; public static final List<String> CONTROLLSVC_LOG_NAMES = Arrays.asList("controllersvc-discovery", "controllersvc-metering", "controllersvc-vplex-api"); public void setServiceMetadataMap(LinkedHashMap<String, ServiceMetadata> serviceMetadataMap) { if (_serviceMetadataMap == null) { _serviceMetadataMap = ImmutableMap.copyOf(serviceMetadataMap); } } public static Map<String, ServiceMetadata> getServiceMetadataMap() { if (_serviceMetadataMap == null) { throw new IllegalStateException("Services metadata doesn't exist"); } return _serviceMetadataMap; } public void setRoleMetadataMap(LinkedHashMap<String, RoleMetadata> roleMetadataMap) { if (_roleMetadataMap == null) { _roleMetadataMap = ImmutableMap.copyOf(roleMetadataMap); } } public static Map<String, RoleMetadata> getRoleMetadataMap() { if (_roleMetadataMap == null) { throw new IllegalStateException("Role metadata doesn't exist"); } return _roleMetadataMap; } @Override public void afterPropertiesSet() throws Exception { // initialize the role-to-service index Splitter splitter = Splitter.on(' ').trimResults().omitEmptyStrings(); Map<String, List<String>> index = new LinkedHashMap<String, List<String>>(); for (String roleName : _roleMetadataMap.keySet()) { ImmutableList.Builder<String> listBuilder = new ImmutableList.Builder<>(); for (ServiceMetadata serviceMetadata : _serviceMetadataMap.values()) { Set<String> roles = Sets.newHashSet(splitter.split(serviceMetadata.getRoles())); if (roles.contains(roleName)) { listBuilder.add(serviceMetadata.getName()); } } index.put(roleName, listBuilder.build()); } _roleServiceIndex = ImmutableMap.copyOf(index); } /** * Returns list of service names that are available for control node */ public static List<String> getControlNodeServiceNames() { if (_serviceMetadataMap == null) { throw new IllegalStateException("Service Metadata does not exist"); } List<String> controlServices = new ArrayList<String>(); for (ServiceMetadata serviceMetadata : _serviceMetadataMap.values()) { if (serviceMetadata.isControlNodeService()) { controlServices.add(serviceMetadata.getName()); } } return controlServices; } public static List<String> getControlNodeLogNames() { if (_serviceMetadataMap == null) { throw new IllegalStateException("Service Metadata does not exist"); } List<String> logNames = new ArrayList<String>(); for (ServiceMetadata serviceMetadata : _serviceMetadataMap.values()) { if (serviceMetadata.isControlNodeService()) { String serviceName = serviceMetadata.getName(); if (serviceName.equals("controllersvc")) { logNames.addAll(CONTROLLSVC_LOG_NAMES); } logNames.add(serviceMetadata.getName()); } } return logNames; } /** * Returns list of service names that are available for extra node */ public static List<String> getExtraNodeServiceNames() { if (_serviceMetadataMap == null) { throw new IllegalStateException("Service Metadata does not exist"); } List<String> extraNodeServices = new ArrayList<String>(); for (ServiceMetadata serviceMetadata : _serviceMetadataMap.values()) { if (serviceMetadata.isExtraNodeService()) { extraNodeServices.add(serviceMetadata.getName()); } } return extraNodeServices; } public static List<String> getRoleServiceNames(String... role) { return getRoleServiceNames(Arrays.asList(role)); } public static List<String> getRoleServiceNames(Iterable<String> roles) { if (_roleServiceIndex == null) { throw new IllegalStateException("Role Index does not exist"); } HashSet<String> names = new HashSet<>(); for (String role : roles) { names.addAll(_roleServiceIndex.get(role)); } return ImmutableList.copyOf(names); } }