blob: 36204f71cc09d567490920feded02881db7eaa5b [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 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;
}
}