/* * 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.funtest.server.utils; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.inject.Inject; import com.google.inject.Injector; import org.apache.ambari.funtest.server.AmbariUserRole; import org.apache.ambari.funtest.server.ClusterConfigParams; import org.apache.ambari.funtest.server.ConnectionParams; import org.apache.ambari.funtest.server.WebRequest; import org.apache.ambari.funtest.server.WebResponse; import org.apache.ambari.funtest.server.api.cluster.AddDesiredConfigurationWebRequest; import org.apache.ambari.funtest.server.api.cluster.CreateClusterWebRequest; import org.apache.ambari.funtest.server.api.cluster.CreateConfigurationWebRequest; import org.apache.ambari.funtest.server.api.cluster.GetRequestStatusWebRequest; import org.apache.ambari.funtest.server.api.cluster.SetUserPrivilegeWebRequest; import org.apache.ambari.funtest.server.api.host.AddHostWebRequest; import org.apache.ambari.funtest.server.api.host.RegisterHostWebRequest; import org.apache.ambari.funtest.server.api.service.AddServiceWebRequest; import org.apache.ambari.funtest.server.api.service.InstallServiceWebRequest; import org.apache.ambari.funtest.server.api.servicecomponent.AddServiceComponentWebRequest; import org.apache.ambari.funtest.server.api.servicecomponenthost.BulkAddServiceComponentHostsWebRequest; import org.apache.ambari.funtest.server.api.servicecomponenthost.BulkSetServiceComponentHostStateWebRequest; import org.apache.ambari.funtest.server.api.user.CreateUserWebRequest; import org.apache.ambari.server.actionmanager.HostRoleStatus; import org.apache.ambari.server.controller.AmbariServer; import org.apache.ambari.server.orm.entities.PrincipalTypeEntity; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.Host; import org.apache.ambari.server.state.State; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.util.Arrays; import java.util.HashMap; import java.util.Map; public class ClusterUtils { private static Log LOG = LogFactory.getLog(ClusterUtils.class); @Inject private Injector injector; public void createSampleCluster(ConnectionParams serverParams) throws Exception { WebResponse response = null; JsonElement jsonResponse; String clusterName = "c1"; String hostName = "host1"; String clusterVersion = "HDP-2.2.0"; /** * Create a cluster */ jsonResponse = RestApiUtils.executeRequest(new CreateClusterWebRequest(serverParams, clusterName, clusterVersion)); /** * Register a host */ if (injector == null) { jsonResponse = RestApiUtils.executeRequest(new RegisterHostWebRequest(serverParams, hostName)); } else { /** * Hack: Until we figure out how to get the agent servlet going, * register a host directly using the Clusters class. */ Clusters clusters = injector.getInstance(Clusters.class); clusters.addHost(hostName); Host host1 = clusters.getHost(hostName); Map<String, String> hostAttributes = new HashMap<String, String>(); hostAttributes.put("os_family", "redhat"); hostAttributes.put("os_release_version", "6.3"); host1.setHostAttributes(hostAttributes); } /** * Add the registered host to the new cluster */ jsonResponse = RestApiUtils.executeRequest(new AddHostWebRequest(serverParams, clusterName, hostName)); /** * Create and add a configuration to our cluster */ String configType = "test-hadoop-env"; String configTag = "version1"; ClusterConfigParams configParams = new ClusterConfigParams(); configParams.setClusterName(clusterName); configParams.setConfigType(configType); configParams.setConfigTag(configTag); configParams.setProperties(new HashMap<String, String>() {{ put("fs.default.name", "localhost:9995"); }}); jsonResponse = RestApiUtils.executeRequest(new CreateConfigurationWebRequest(serverParams, configParams)); /** * Apply the desired configuration to our cluster */ jsonResponse = RestApiUtils.executeRequest(new AddDesiredConfigurationWebRequest(serverParams, configParams)); /** * Add a service to the cluster */ String serviceName = "HDFS"; jsonResponse = RestApiUtils.executeRequest(new AddServiceWebRequest(serverParams, clusterName, serviceName)); String [] componentNames = new String [] {"NAMENODE", "DATANODE", "SECONDARY_NAMENODE"}; /** * Add components to the service */ for (String componentName : componentNames) { jsonResponse = RestApiUtils.executeRequest(new AddServiceComponentWebRequest(serverParams, clusterName, serviceName, componentName)); } /** * Install the service */ jsonResponse = RestApiUtils.executeRequest(new InstallServiceWebRequest(serverParams, clusterName, serviceName)); /** * Add components to the hostß */ jsonResponse = RestApiUtils.executeRequest(new BulkAddServiceComponentHostsWebRequest(serverParams, clusterName, Arrays.asList(hostName), Arrays.asList(componentNames))); /** * Install the service component hosts */ jsonResponse = RestApiUtils.executeRequest(new BulkSetServiceComponentHostStateWebRequest(serverParams, clusterName, State.INIT, State.INSTALLED)); if (!jsonResponse.isJsonNull()) { int requestId = parseRequestId(jsonResponse); RequestStatusPoller.poll(serverParams, clusterName, requestId); } /** * Start the service component hosts */ jsonResponse = RestApiUtils.executeRequest(new BulkSetServiceComponentHostStateWebRequest(serverParams, clusterName, State.INSTALLED, State.STARTED)); if (!jsonResponse.isJsonNull()) { int requestId = parseRequestId(jsonResponse); RequestStatusPoller.poll(serverParams, clusterName, requestId); } /** * Start the service */ //jsonResponse = RestApiUtils.executeRequest(new StartServiceWebRequest(serverParams, clusterName, serviceName)); } /** * Creates a user with the specified role. * * @param connectionParams * @param clusterName * @param userName * @param password * @param userRole * @throws Exception */ public static void createUser(ConnectionParams connectionParams, String clusterName,String userName, String password, AmbariUserRole userRole ) throws Exception { JsonElement jsonResponse; jsonResponse = RestApiUtils.executeRequest(new CreateUserWebRequest(connectionParams, userName, password, CreateUserWebRequest.ActiveUser.TRUE, CreateUserWebRequest.AdminUser.FALSE)); LOG.info(jsonResponse); if (userRole != AmbariUserRole.NONE) { jsonResponse = RestApiUtils.executeRequest(new SetUserPrivilegeWebRequest(connectionParams, clusterName, userName, userRole, PrincipalTypeEntity.USER_PRINCIPAL_TYPE_NAME)); LOG.info(jsonResponse); } } /** * Creates a user with CLUSTER.USER privilege. * * @param connectionParams * @param clusterName * @param userName * @param password * @throws Exception */ public static void createUserClusterUser(ConnectionParams connectionParams, String clusterName, String userName, String password) throws Exception { createUser(connectionParams, clusterName, userName, password, AmbariUserRole.CLUSTER_USER); } /** * Creates a user with SERVICE.OPERATOR privilege * * @param connectionParams * @param clusterName * @param userName * @param password * @throws Exception */ public static void createUserServiceOperator(ConnectionParams connectionParams, String clusterName, String userName, String password) throws Exception { createUser(connectionParams, clusterName, userName, password, AmbariUserRole.SERVICE_OPERATOR); } /** * Creates a user with SERVICE.ADMINISTRATOR privilege * * @param connectionParams * @param clusterName * @param userName * @param password * @throws Exception */ public static void createUserServiceAdministrator(ConnectionParams connectionParams, String clusterName, String userName, String password) throws Exception { createUser(connectionParams, clusterName, userName, password, AmbariUserRole.SERVICE_ADMINISTRATOR); } /** * Creates a user with CLUSTER.OPERATOR privilege * * @param connectionParams * @param clusterName * @param userName * @param password * @throws Exception */ public static void createUserClusterOperator(ConnectionParams connectionParams, String clusterName, String userName, String password) throws Exception { createUser(connectionParams, clusterName, userName, password, AmbariUserRole.CLUSTER_OPERATOR); } /** * Creates a user with CLUSTER.ADMINISTRATOR privilege. * * @param connectionParams * @param clusterName * @param userName * @param password * @throws Exception */ public static void createUserClusterAdministrator(ConnectionParams connectionParams, String clusterName, String userName, String password) throws Exception { createUser(connectionParams, clusterName, userName, password, AmbariUserRole.CLUSTER_ADMINISTRATOR); } /** * Parses a JSON response string for { "Requests" : { "id" : "2" } } * * @param jsonResponse * @return - request id * @throws IllegalArgumentException */ private static int parseRequestId(JsonElement jsonResponse) throws IllegalArgumentException { if (jsonResponse.isJsonNull()) { throw new IllegalArgumentException("jsonResponse with request id expected."); } JsonObject jsonObject = jsonResponse.getAsJsonObject(); int requestId = jsonObject.get("Requests").getAsJsonObject().get("id").getAsInt(); return requestId; } }