protected void deleteHosts(Set<HostRequest> requests) throws AmbariException { AmbariManagementController controller = getManagementController(); Clusters clusters = controller.getClusters(); List<HostRequest> okToRemove = new ArrayList<HostRequest>(); for (HostRequest hostRequest : requests) { String hostName = hostRequest.getHostname(); if (null == hostName) { continue; } Set<String> clusterNamesForHost = new HashSet<String>(); if (null != hostRequest.getClusterName()) { clusterNamesForHost.add(hostRequest.getClusterName()); } else { Set<Cluster> clustersForHost = clusters.getClustersForHost(hostRequest.getHostname()); if (null != clustersForHost) { for (Cluster c : clustersForHost) { clusterNamesForHost.add(c.getClusterName()); } } } for (String clusterName : clusterNamesForHost) { Cluster cluster = clusters.getCluster(clusterName); List<ServiceComponentHost> list = cluster.getServiceComponentHosts(hostName); if (!list.isEmpty()) { List<String> componentsToRemove = new ArrayList<String>(); for (ServiceComponentHost sch : list) { Service s = cluster.getService(sch.getServiceName()); ServiceComponent sc = s.getServiceComponent(sch.getServiceComponentName()); // Masters and Slaves must be deleted first. Clients are ok. if (!sc.isClientComponent()) { componentsToRemove.add(sch.getServiceComponentName()); } } if (!componentsToRemove.isEmpty()) { StringBuilder reason = new StringBuilder("Cannot remove host ") .append(hostName) .append(" from ") .append(hostRequest.getClusterName()) .append( ". The following roles exist, and these components must be stopped if running, and then deleted: "); reason.append(StringUtils.join(componentsToRemove, ", ")); throw new AmbariException(reason.toString()); } } } okToRemove.add(hostRequest); } for (HostRequest hostRequest : okToRemove) { // Assume the user also wants to delete it entirely, including all clusters. clusters.deleteHost(hostRequest.getHostname()); if (null != hostRequest.getClusterName()) { clusters.getCluster(hostRequest.getClusterName()).recalculateAllClusterVersionStates(); } } }
protected synchronized void updateHosts(Set<HostRequest> requests) throws AmbariException { if (requests.isEmpty()) { LOG.warn("Received an empty requests set"); return; } AmbariManagementController controller = getManagementController(); Clusters clusters = controller.getClusters(); for (HostRequest request : requests) { if (request.getHostname() == null || request.getHostname().isEmpty()) { throw new IllegalArgumentException("Invalid arguments, hostname should be provided"); } } for (HostRequest request : requests) { if (LOG.isDebugEnabled()) { LOG.debug( "Received an updateHost request" + ", hostname=" + request.getHostname() + ", request=" + request); } Host host = clusters.getHost(request.getHostname()); String clusterName = request.getClusterName(); try { // The below method call throws an exception when trying to create a duplicate mapping in // the clusterhostmapping // table. This is done to detect duplicates during host create. In order to be robust, // handle these gracefully. clusters.mapHostToCluster(request.getHostname(), clusterName); } catch (DuplicateResourceException e) { // do nothing } if (null != request.getHostAttributes()) { host.setHostAttributes(request.getHostAttributes()); } String rackInfo = host.getRackInfo(); String requestRackInfo = request.getRackInfo(); boolean rackChange = requestRackInfo != null && !requestRackInfo.equals(rackInfo); if (rackChange) { host.setRackInfo(requestRackInfo); } if (null != request.getPublicHostName()) { host.setPublicHostName(request.getPublicHostName()); } if (null != clusterName && null != request.getMaintenanceState()) { Cluster c = clusters.getCluster(clusterName); MaintenanceState newState = MaintenanceState.valueOf(request.getMaintenanceState()); MaintenanceState oldState = host.getMaintenanceState(c.getClusterId()); if (!newState.equals(oldState)) { if (newState.equals(MaintenanceState.IMPLIED_FROM_HOST) || newState.equals(MaintenanceState.IMPLIED_FROM_SERVICE)) { throw new IllegalArgumentException( "Invalid arguments, can only set " + "maintenance state to one of " + EnumSet.of(MaintenanceState.OFF, MaintenanceState.ON)); } else { host.setMaintenanceState(c.getClusterId(), newState); } } } // Create configurations if (null != clusterName && null != request.getDesiredConfigs()) { Cluster c = clusters.getCluster(clusterName); if (clusters.getHostsForCluster(clusterName).containsKey(host.getHostName())) { for (ConfigurationRequest cr : request.getDesiredConfigs()) { if (null != cr.getProperties() && cr.getProperties().size() > 0) { LOG.info( MessageFormat.format( "Applying configuration with tag ''{0}'' to host ''{1}'' in cluster ''{2}''", cr.getVersionTag(), request.getHostname(), clusterName)); cr.setClusterName(c.getClusterName()); controller.createConfiguration(cr); } Config baseConfig = c.getConfig(cr.getType(), cr.getVersionTag()); if (null != baseConfig) { String authName = controller.getAuthName(); DesiredConfig oldConfig = host.getDesiredConfigs(c.getClusterId()).get(cr.getType()); if (host.addDesiredConfig(c.getClusterId(), cr.isSelected(), authName, baseConfig)) { Logger logger = LoggerFactory.getLogger("configchange"); logger.info( "cluster '" + c.getClusterName() + "', " + "host '" + host.getHostName() + "' " + "changed by: '" + authName + "'; " + "type='" + baseConfig.getType() + "' " + "version='" + baseConfig.getVersion() + "'" + "tag='" + baseConfig.getTag() + "'" + (null == oldConfig ? "" : ", from='" + oldConfig.getTag() + "'")); } } } } } if (clusterName != null && !clusterName.isEmpty()) { clusters.getCluster(clusterName).recalculateAllClusterVersionStates(); if (rackChange) { controller.registerRackChange(clusterName); } } // todo: if attempt was made to update a property other than those // todo: that are allowed above, should throw exception } }