blob: b5d3952a36a80bec642ff563bb5b0a448a9e3f8b [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 distribut
* ed 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.ambari.server.topology;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.ambari.server.controller.internal.ProvisionAction;
import org.apache.ambari.server.controller.internal.Stack;
import org.apache.ambari.server.orm.entities.HostGroupComponentEntity;
import org.apache.ambari.server.orm.entities.HostGroupConfigEntity;
import org.apache.ambari.server.orm.entities.HostGroupEntity;
import com.google.gson.Gson;
/**
* Host Group implementation.
*/
public class HostGroupImpl implements HostGroup {
/**
* host group name
*/
private String name;
/**
* blueprint name
*/
private String blueprintName;
/**
* components contained in the host group
*/
private Map<String, Component> components = new HashMap<>();
/**
* map of service to components for the host group
*/
private Map<String, Set<String>> componentsForService = new HashMap<>();
/**
* configuration
*/
private Configuration configuration = null;
private boolean containsMasterComponent = false;
private Stack stack;
private String cardinality = "NOT SPECIFIED";
public HostGroupImpl(HostGroupEntity entity, String blueprintName, Stack stack) {
this.name = entity.getName();
this.cardinality = entity.getCardinality();
this.blueprintName = blueprintName;
this.stack = stack;
parseComponents(entity);
parseConfigurations(entity);
}
public HostGroupImpl(String name, String bpName, Stack stack, Collection<Component> components, Configuration configuration, String cardinality) {
this.name = name;
this.blueprintName = bpName;
this.stack = stack;
// process each component
for (Component component : components) {
addComponent(component.getName(), component.getService(), component.getProvisionAction());
}
this.configuration = configuration;
if (cardinality != null && ! cardinality.equals("null")) {
this.cardinality = cardinality;
}
}
@Override
public String getName() {
return name;
}
//todo: currently not qualifying host group name
@Override
public String getFullyQualifiedName() {
return String.format("%s:%s", blueprintName, getName());
}
//todo: currently not qualifying host group name
public static String formatAbsoluteName(String bpName, String hgName) {
return String.format("%s:%s", bpName, hgName);
}
@Override
public Collection<Component> getComponents() {
return components.values();
}
@Override
public Collection<String> getComponentNames() {
return components.keySet();
}
@Override
public Collection<String> getComponentNames(ProvisionAction provisionAction) {
Set<String> setOfComponentNames = new HashSet<>();
for (String componentName : components.keySet()) {
Component component = components.get(componentName);
if ( (component.getProvisionAction() != null) && (component.getProvisionAction() == provisionAction) ) {
setOfComponentNames.add(componentName);
}
}
return setOfComponentNames;
}
/**
* Get the services which are deployed to this host group.
*
* @return collection of services which have components in this host group
*/
@Override
public Collection<String> getServices() {
return componentsForService.keySet();
}
/**
* Add a component to the host group.
*
* @param component component to add
*
* @return true if component was added; false if component already existed
*/
@Override
public boolean addComponent(String component, Service service) {
return this.addComponent(component, service);
}
@Override
// TODO BP3.0
public boolean addComponent(String component) {
throw new UnsupportedOperationException("Not supported with 3.0 blueprints.");
}
/**
* Add a component with the specified provision action to the
* host group.
*
* @param component component name
* @param provisionAction provision action for this component
*
* @return true if component was added; false if component already existed
*/
public boolean addComponent(String component, Service service, ProvisionAction provisionAction) {
boolean added;
if (!components.containsKey(component)) {
components.put(component, new Component(component, service, provisionAction, null));
added = true;
} else {
added = false;
}
if (stack.isMasterComponent(component)) {
containsMasterComponent = true;
}
// TODO review for BP3.0
if (added) {
if (service != null) {
// an example of a component without a service in the stack is AMBARI_SERVER
Set<String> serviceComponents = componentsForService.get(service.getName());
if (serviceComponents == null) {
serviceComponents = new HashSet<>();
componentsForService.put(service.getName(), serviceComponents);
}
serviceComponents.add(component);
}
}
return added;
}
/**
* Get the components for the specified service which are associated with the host group.
*
* @param service service name
*
* @return set of component names
*/
@Override
public Collection<String> getComponents(String service) {
return componentsForService.containsKey(service) ?
new HashSet<>(componentsForService.get(service)) :
Collections.emptySet();
}
/**
* Get this host groups configuration.
*
* @return configuration instance
*/
@Override
public Configuration getConfiguration() {
return configuration;
}
/**
* Get the associated blueprint name.
*
* @return associated blueprint name
*/
@Override
public String getBlueprintName() {
return blueprintName;
}
@Override
public boolean containsMasterComponent() {
return containsMasterComponent;
}
@Override
public Stack getStack() {
return stack;
}
@Override
public String getCardinality() {
return cardinality;
}
/**
* Parse component information.
*/
//TODO set service
private void parseComponents(HostGroupEntity entity) {
for (HostGroupComponentEntity componentEntity : entity.getComponents() ) {
if (componentEntity.getProvisionAction() != null) {
addComponent(componentEntity.getName(), null, ProvisionAction.valueOf(componentEntity.getProvisionAction()));
} else {
addComponent(componentEntity.getName(), null);
}
}
}
/**
* Parse host group configurations.
*/
//todo: use ConfigurationFactory
private void parseConfigurations(HostGroupEntity entity) {
Map<String, Map<String, String>> config = new HashMap<>();
Gson jsonSerializer = new Gson();
for (HostGroupConfigEntity configEntity : entity.getConfigurations()) {
String type = configEntity.getType();
Map<String, String> typeProperties = config.get(type);
if ( typeProperties == null) {
typeProperties = new HashMap<>();
config.put(type, typeProperties);
}
Map<String, String> propertyMap = jsonSerializer.<Map<String, String>>fromJson(
configEntity.getConfigData(), Map.class);
if (propertyMap != null) {
typeProperties.putAll(propertyMap);
}
}
//todo: parse attributes
Map<String, Map<String, Map<String, String>>> attributes = new HashMap<>();
configuration = new Configuration(config, attributes);
}
public String toString(){
return name;
}
}