/** * 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 org.apache.ambari.shell.commands; import static org.apache.ambari.shell.support.TableRenderer.renderMapValueMap; import static org.apache.ambari.shell.support.TableRenderer.renderSingleMap; import org.apache.ambari.groovy.client.AmbariClient; import org.apache.ambari.shell.completion.Service; import org.apache.ambari.shell.model.AmbariContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.shell.core.CommandMarker; import org.springframework.shell.core.annotation.CliAvailabilityIndicator; import org.springframework.shell.core.annotation.CliCommand; import org.springframework.shell.core.annotation.CliOption; import org.springframework.stereotype.Component; /** * Service related commands used in the shell. * * @see org.apache.ambari.groovy.client.AmbariClient */ @Component public class ServiceCommands implements CommandMarker { private AmbariClient client; private AmbariContext context; @Autowired public ServiceCommands(AmbariClient client, AmbariContext context) { this.client = client; this.context = context; } /** * Checks whether the services list command is available or not. * * @return true if available false otherwise */ @CliAvailabilityIndicator("services list") public boolean isServiceListCommandAvailable() { return context.isConnectedToCluster(); } /** * Prints the available services list of the Ambari Server. * * @return service list */ @CliCommand(value = "services list", help = "Lists the available services") public String servicesList() { return renderSingleMap(client.getServicesMap(), "SERVICE", "STATE"); } /** * Checks whether the services components command is available or not. * * @return true if available false otherwise */ @CliAvailabilityIndicator("services components") public boolean isServiceComponentsCommandAvailable() { return context.isConnectedToCluster(); } /** * Prints the services components of the Ambari Server. * * @return service component list */ @CliCommand(value = "services components", help = "Lists all services with their components") public String serviceComponents() { return renderMapValueMap(client.getServiceComponentsMap(), "SERVICE", "COMPONENT", "STATE"); } /** * Checks whether the services stop command is available or not. * * @return true if available false otherwise */ @CliAvailabilityIndicator("services stop") public boolean isServiceStopCommandAvailable() { return context.isConnectedToCluster(); } /** * Stops a service or all services if no service name is provided. * * @return service list */ @CliCommand(value = "services stop", help = "Stops a service/all the running services") public String stopServices(@CliOption(key = "service", mandatory = false, help = "Name of the service to stop") Service service) { String message; try { if (service != null) { String serviceName = service.getName(); message = "Stopping " + serviceName; client.stopService(serviceName); } else { message = "Stopping all services.."; client.stopAllServices(); } } catch (Exception e) { message = "Cannot stop services"; } return String.format("%s\n\n%s", message, servicesList()); } /** * Checks whether the services start command is available or not. * * @return true if available false otherwise */ @CliAvailabilityIndicator("services start") public boolean isServiceStartCommandAvailable() { return context.isConnectedToCluster(); } /** * Starts a service or all services if no service name is provided. * * @return service list */ @CliCommand(value = "services start", help = "Starts a service/all the services") public String startServices(@CliOption(key = "service", mandatory = false, help = "Name of the service to start") Service service) { String message; try { if (service != null) { String serviceName = service.getName(); message = "Starting " + serviceName; client.startService(serviceName); } else { client.startAllServices(); message = "Starting all services.."; } } catch (Exception e) { message = "Cannot start services"; } return String.format("%s\n\n%s", message, servicesList()); } }