/*
* 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.jclouds.abiquo.environment;
import static com.google.common.collect.Iterables.find;
import static com.google.common.collect.Iterables.size;
import static org.jclouds.abiquo.reference.AbiquoTestConstants.PREFIX;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
import java.io.IOException;
import java.net.URI;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.UUID;
import org.jclouds.abiquo.AbiquoContext;
import org.jclouds.abiquo.domain.config.License;
import org.jclouds.abiquo.domain.enterprise.Enterprise;
import org.jclouds.abiquo.domain.enterprise.Limits;
import org.jclouds.abiquo.domain.enterprise.Role;
import org.jclouds.abiquo.domain.enterprise.User;
import org.jclouds.abiquo.domain.infrastructure.Datacenter;
import org.jclouds.abiquo.domain.infrastructure.Datastore;
import org.jclouds.abiquo.domain.infrastructure.Machine;
import org.jclouds.abiquo.domain.infrastructure.NetworkInterface;
import org.jclouds.abiquo.domain.infrastructure.Rack;
import org.jclouds.abiquo.domain.infrastructure.RemoteService;
import org.jclouds.abiquo.domain.infrastructure.StorageDevice;
import org.jclouds.abiquo.domain.infrastructure.StorageDeviceMetadata;
import org.jclouds.abiquo.domain.infrastructure.StoragePool;
import org.jclouds.abiquo.domain.infrastructure.Tier;
import org.jclouds.abiquo.domain.network.ExternalNetwork;
import org.jclouds.abiquo.domain.network.NetworkServiceType;
import org.jclouds.abiquo.domain.network.PublicNetwork;
import org.jclouds.abiquo.domain.network.UnmanagedNetwork;
import org.jclouds.abiquo.features.AdminApi;
import org.jclouds.abiquo.features.ConfigApi;
import org.jclouds.abiquo.features.EnterpriseApi;
import org.jclouds.abiquo.features.InfrastructureApi;
import org.jclouds.abiquo.features.services.AdministrationService;
import org.jclouds.abiquo.util.Config;
import com.abiquo.model.enumerator.HypervisorType;
import com.google.common.base.Predicate;
import com.google.common.io.LineProcessor;
import com.google.common.io.Resources;
/**
* Test environment for infrastructure live tests.
*
* @author Ignasi Barrera
*/
public class InfrastructureTestEnvironment implements TestEnvironment {
/** The rest context. */
public AbiquoContext context;
// Environment data made public so tests can use them easily
public AdministrationService administrationService;
public InfrastructureApi infrastructureApi;
public EnterpriseApi enterpriseApi;
public AdminApi adminApi;
public ConfigApi configApi;
// Resources
public License license;
public Datacenter datacenter;
public PublicNetwork publicNetwork;
public ExternalNetwork externalNetwork;
public UnmanagedNetwork unmanagedNetwork;
public Iterable<RemoteService> remoteServices;
public Rack rack;
public Machine machine;
public Enterprise enterprise;
public StorageDevice storageDevice;
public StoragePool storagePool;
public Tier tier;
public User user;
public User enterpriseAdmin;
public Role role;
public Role anotherRole;
public InfrastructureTestEnvironment(final AbiquoContext context) {
super();
this.context = context;
this.administrationService = context.getAdministrationService();
this.context = context;
this.enterpriseApi = context.getApiContext().getApi().getEnterpriseApi();
this.infrastructureApi = context.getApiContext().getApi().getInfrastructureApi();
this.adminApi = context.getApiContext().getApi().getAdminApi();
this.configApi = context.getApiContext().getApi().getConfigApi();
}
@Override
public void setup() throws Exception {
// Configuration
createLicense();
// Intrastructure
createDatacenter();
createRack();
createMachine();
createStorageDevice();
createStoragePool();
createPublicNetwork();
// Enterprise
createEnterprise();
createRoles();
createUsers();
// Networking
createExternalNetwork();
createUnmanagedNetwork();
}
@Override
public void tearDown() throws Exception {
deleteUsers();
deleteRole(role);
deleteRole(anotherRole);
deleteUnmanagedNetwork();
deleteExternalNetwork();
deletePublicNetwork();
deleteStoragePool();
deleteStorageDevice();
deleteMachine();
deleteRack();
deleteDatacenter();
deleteEnterprise();
deleteLicense();
}
// Setup
protected void createLicense() throws IOException {
license = License.builder(context.getApiContext(), readLicense()).build();
license.add();
assertNotNull(license.getId());
}
protected void createDatacenter() {
// Assume a monolithic install
URI endpoint = URI.create(context.getApiContext().getProviderMetadata().getEndpoint());
String remoteServicesAddress = endpoint.getHost();
datacenter = Datacenter.builder(context.getApiContext()).name(randomName()).location("Honolulu")
.remoteServices(remoteServicesAddress).build();
datacenter.save();
assertNotNull(datacenter.getId());
remoteServices = datacenter.listRemoteServices();
assertEquals(size(remoteServices), 7);
}
protected void createMachine() {
String ip = Config.get("abiquo.hypervisor.address");
HypervisorType type = HypervisorType.valueOf(Config.get("abiquo.hypervisor.type"));
String user = Config.get("abiquo.hypervisor.user");
String pass = Config.get("abiquo.hypervisor.pass");
final String vswitchName = Config.get("abiquo.hypervisor.vswitch");
final String datastoreName = Config.get("abiquo.hypervisor.datastore");
machine = datacenter.discoverSingleMachine(ip, type, user, pass);
NetworkServiceType nst = datacenter.defaultNetworkServiceType();
NetworkInterface vswitch = find(machine.getNetworkInterfaces(), new Predicate<NetworkInterface>() {
@Override
public boolean apply(NetworkInterface input) {
return input.getName().equals(vswitchName);
}
});
vswitch.setNetworkServiceType(nst);
Datastore datastore = find(machine.getDatastores(), new Predicate<Datastore>() {
@Override
public boolean apply(Datastore input) {
return input.getName().equals(datastoreName);
}
});
datastore.setEnabled(true);
machine.setRack(rack);
machine.save();
assertNotNull(machine.getId());
}
protected void createRack() {
rack = Rack.builder(context.getApiContext(), datacenter).name(PREFIX + "Aloha").build();
rack.save();
assertNotNull(rack.getId());
}
protected void createStorageDevice() {
String ip = Config.get("abiquo.storage.address");
final String type = Config.get("abiquo.storage.type");
String user = Config.get("abiquo.storage.user");
String pass = Config.get("abiquo.storage.pass");
Iterable<StorageDeviceMetadata> devices = datacenter.listSupportedStorageDevices();
StorageDeviceMetadata metadata = find(devices, new Predicate<StorageDeviceMetadata>() {
@Override
public boolean apply(StorageDeviceMetadata input) {
return input.getType().equals(type);
}
});
storageDevice = StorageDevice.builder(context.getApiContext(), datacenter) //
.name(PREFIX + "Storage Device")//
.type(type)//
.managementIp(ip).managementPort(metadata.getDefaultManagementPort())//
.iscsiIp(ip).iscsiPort(metadata.getDefaultIscsiPort()) //
.username(user)//
.password(pass) //
.build();
storageDevice.save();
assertNotNull(storageDevice.getId());
}
protected void createStoragePool() {
final String pool = Config.get("abiquo.storage.pool");
storagePool = find(storageDevice.listRemoteStoragePools(), new Predicate<StoragePool>() {
@Override
public boolean apply(StoragePool input) {
return input.getName().equals(pool);
}
});
tier = find(datacenter.listTiers(), new Predicate<Tier>() {
@Override
public boolean apply(Tier input) {
return input.getName().equals("Default Tier 1");
}
});
storagePool.setTier(tier);
storagePool.save();
assertNotNull(storagePool.getUUID());
}
protected void createUsers() {
Iterable<Role> roles = administrationService.listRoles();
Role userRole = find(roles, role("USER"));
Role enterpriseAdminRole = find(roles, role("ENTERPRISE_ADMIN"));
user = User.builder(context.getApiContext(), enterprise, userRole).name(randomName(), randomName())
.nick("jclouds").authType("ABIQUO").description(randomName()).email(randomName() + "@abiquo.com")
.locale("en_US").password("user").build();
user.save();
assertNotNull(user.getId());
assertEquals(userRole.getId(), user.getRole().getId());
enterpriseAdmin = User.builder(context.getApiContext(), enterprise, enterpriseAdminRole)
.name(randomName(), randomName()).nick("jclouds-admin").authType("ABIQUO").description(randomName())
.email(randomName() + "@abiquo.com").locale("en_US").password("admin").build();
enterpriseAdmin.save();
assertNotNull(enterpriseAdmin.getId());
assertEquals(enterpriseAdminRole.getId(), enterpriseAdmin.getRole().getId());
}
protected void createRoles() {
role = Role.builder(context.getApiContext()).name(randomName()).blocked(false).build();
role.save();
anotherRole = Role.Builder.fromRole(role).build();
anotherRole.setName("Another role");
anotherRole.save();
assertNotNull(role.getId());
assertNotNull(anotherRole.getId());
}
protected void createEnterprise() {
enterprise = Enterprise.builder(context.getApiContext()).name(randomName()).build();
enterprise.save();
assertNotNull(enterprise.getId());
Limits limits = enterprise.allowDatacenter(datacenter);
assertNotNull(limits);
}
protected void createPublicNetwork() {
publicNetwork = PublicNetwork.builder(context.getApiContext(), datacenter).name("PublicNetwork")
.gateway("80.80.80.1").address("80.80.80.0").mask(24).tag(5).build();
publicNetwork.save();
assertNotNull(publicNetwork.getId());
}
protected void createExternalNetwork() {
externalNetwork = ExternalNetwork.builder(context.getApiContext(), datacenter, enterprise)
.name("ExternalNetwork").gateway("10.0.0.1").address("10.0.0.0").mask(24).tag(7).build();
externalNetwork.save();
assertNotNull(externalNetwork.getId());
}
protected void createUnmanagedNetwork() {
unmanagedNetwork = UnmanagedNetwork.builder(context.getApiContext(), datacenter, enterprise)
.name("UnmanagedNetwork").gateway("10.0.1.1").address("10.0.1.0").mask(24).tag(8).build();
unmanagedNetwork.save();
assertNotNull(unmanagedNetwork.getId());
}
// Tear down
protected void deleteUnmanagedNetwork() {
if (unmanagedNetwork != null) {
Integer id = unmanagedNetwork.getId();
unmanagedNetwork.delete();
assertNull(datacenter.getNetwork(id));
}
}
protected void deleteExternalNetwork() {
if (externalNetwork != null) {
Integer id = externalNetwork.getId();
externalNetwork.delete();
assertNull(datacenter.getNetwork(id));
}
}
protected void deletePublicNetwork() {
if (publicNetwork != null) {
Integer id = publicNetwork.getId();
publicNetwork.delete();
assertNull(datacenter.getNetwork(id));
}
}
protected void deleteUsers() {
if (user != null) {
String nick = user.getNick();
user.delete();
// Nick is unique in an enterprise
assertNull(find(enterprise.listUsers(), nick(nick), null));
}
if (enterpriseAdmin != null) {
String nick = enterpriseAdmin.getNick();
enterpriseAdmin.delete();
// Nick is unique in an enterprise
assertNull(find(enterprise.listUsers(), nick(nick), null));
}
}
protected void deleteRole(final Role role) {
if (role != null) {
Integer roleId = role.getId();
role.delete();
assertNull(adminApi.getRole(roleId));
}
}
protected void deleteStoragePool() {
if (storagePool != null) {
String idStoragePool = storagePool.getUUID();
storagePool.delete();
assertNull(infrastructureApi.getStoragePool(storageDevice.unwrap(), idStoragePool));
}
}
protected void deleteStorageDevice() {
if (storageDevice != null) {
Integer idStorageDevice = storageDevice.getId();
storageDevice.delete();
assertNull(infrastructureApi.getStorageDevice(datacenter.unwrap(), idStorageDevice));
}
}
protected void deleteMachine() {
if (machine != null && rack != null) {
Integer idMachine = machine.getId();
machine.delete();
assertNull(infrastructureApi.getMachine(rack.unwrap(), idMachine));
}
}
protected void deleteRack() {
if (rack != null && datacenter != null) {
Integer idRack = rack.getId();
rack.delete();
assertNull(infrastructureApi.getRack(datacenter.unwrap(), idRack));
}
}
protected void deleteDatacenter() {
if (datacenter != null) {
// Remove limits first
enterprise.prohibitDatacenter(datacenter);
Integer idDatacenter = datacenter.getId();
datacenter.delete(); // Abiquo API will delete remote services too
assertNull(infrastructureApi.getDatacenter(idDatacenter));
}
}
protected void deleteEnterprise() {
if (enterprise != null) {
Integer idEnterprise = enterprise.getId();
enterprise.delete();
assertNull(enterpriseApi.getEnterprise(idEnterprise));
}
}
protected void deleteLicense() {
license.remove();
}
protected static String randomName() {
return PREFIX + UUID.randomUUID().toString().substring(0, 12);
}
// Utility methods
public static String readLicense() throws IOException {
URL url = CloudTestEnvironment.class.getResource("/license/expired");
return Resources.readLines(url, Charset.defaultCharset(), new LineProcessor<String>() {
StringBuilder sb = new StringBuilder();
@Override
public String getResult() {
return sb.toString();
}
@Override
public boolean processLine(String line) throws IOException {
if (!line.startsWith("#")) {
sb.append(line);
}
return true;
}
});
}
private static Predicate<Role> role(final String role) {
return new Predicate<Role>() {
@Override
public boolean apply(Role input) {
return input.getName().equals(role);
}
};
}
private static Predicate<User> nick(final String nick) {
return new Predicate<User>() {
@Override
public boolean apply(User input) {
return input.getNick().equals(nick);
}
};
}
}