/*
* Copyright to the original author or authors.
*
* Licensed 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.rioproject.monitor.service;
import net.jini.config.Configuration;
import net.jini.core.event.UnknownEventException;
import net.jini.id.Uuid;
import net.jini.id.UuidFactory;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.rioproject.deploy.*;
import org.rioproject.impl.config.DynamicConfiguration;
import org.rioproject.impl.opstring.OpString;
import org.rioproject.impl.system.SystemCapabilities;
import org.rioproject.opstring.OperationalString;
import org.rioproject.opstring.OperationalStringManager;
import org.rioproject.opstring.ServiceElement;
import org.rioproject.resolver.ResolverConfiguration;
import org.rioproject.sla.ServiceLevelAgreements;
import org.rioproject.system.ComputeResourceUtilization;
import org.rioproject.system.MeasuredResource;
import org.rioproject.system.ResourceCapability;
import org.rioproject.system.capability.PlatformCapability;
import org.rioproject.system.capability.connectivity.TCPConnectivity;
import org.rioproject.system.capability.platform.OperatingSystem;
import org.rioproject.system.capability.platform.ProcessorArchitecture;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.rmi.RemoteException;
import java.security.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* @author Dennis Reedy
*/
public class InstantiatorResourceTest {
InstantiatorResource instantiatorResource;
DefaultOpStringManager manager;
ServiceElement service;
static {
System.setProperty("StaticCybernode", "true");
Policy.setPolicy(new Policy() {
public PermissionCollection getPermissions(CodeSource codesource) {
Permissions perms = new Permissions();
perms.add(new AllPermission());
return (perms);
}
public void refresh() {
}
});
System.setSecurityManager(new SecurityManager());
}
@BeforeClass
public static void setResolverJar() {
String classPath = System.getProperty("java.class.path");
String[] parts = classPath.split(File.pathSeparator);
String resolverJar = null;
for(String part : parts) {
if(part.contains("resolver-aether")) {
resolverJar = part;
break;
}
}
org.junit.Assert.assertNotNull(resolverJar);
System.setProperty(ResolverConfiguration.RESOLVER_JAR, resolverJar);
}
@Before
public void setup() throws IOException {
SBI sbi = new SBI();
List<MeasuredResource> measuredResources = new ArrayList<MeasuredResource>();
ComputeResourceUtilization resourceUtilization = new ComputeResourceUtilization("test",
sbi.inetAddress.getHostAddress(),
sbi.inetAddress.getHostName(),
measuredResources);
SystemCapabilities systemCapabilities = new SystemCapabilities();
PlatformCapability[] platformCapabilities = systemCapabilities.getPlatformCapabilities(new DynamicConfiguration());
ResourceCapability resourceCapability = new ResourceCapability(sbi.inetAddress.getHostAddress(),
sbi.inetAddress.getHostName(),
true,
platformCapabilities,
resourceUtilization);
instantiatorResource = new InstantiatorResource(null,
sbi,
"test",
sbi.uuid,
null,
resourceCapability,
50);
service = createServiceElement();
OperationalString opString = new OpString("test", null);
opString.addService(service);
OpStringManager parent = null;
boolean active = true;
Configuration config = new DynamicConfiguration();
OpStringManagerController opStringManagerController = new OpStringManagerController();
manager = new DefaultOpStringManager(opString,
parent,
config,
opStringManagerController);
manager.initialize(active);
}
@Test
public void testMeetsGeneralRequirements() throws Exception {
ProvisionRequest request = createProvisionRequest();
Assert.assertTrue(instantiatorResource.meetsGeneralRequirements(request));
}
@Test
public void testMeetsQualitativeRequirements() throws Exception {
ProvisionRequest request = createProvisionRequest();
request.getServiceElement().setServiceLevelAgreements(createServiceLevelAgreements(true, true));
Collection<SystemComponent> notSupported = instantiatorResource.meetsQualitativeRequirements(request);
Assert.assertEquals(0, notSupported.size());
}
@Test
public void testDoesNotMeetArchitectureRequirements() throws Exception {
ProvisionRequest request = createProvisionRequest();
request.getServiceElement().setServiceLevelAgreements(createServiceLevelAgreements(false, true));
Collection<SystemComponent> notSupported = instantiatorResource.meetsQualitativeRequirements(request);
Assert.assertTrue(notSupported.size() > 0);
}
@Test
public void testDoesNotMeetOperatingSystemRequirements() throws Exception {
ProvisionRequest request = createProvisionRequest();
request.getServiceElement().setServiceLevelAgreements(createServiceLevelAgreements(true, false));
Collection<SystemComponent> notSupported = instantiatorResource.meetsQualitativeRequirements(request);
Assert.assertTrue(notSupported.size()>0);
}
@Test
public void testMeetsQuantitativeRequirements() throws Exception {
ProvisionRequest request = createProvisionRequest();
Assert.assertTrue(instantiatorResource.meetsQuantitativeRequirements(request));
}
@Test
public void testMeetsClusterRequirements() throws UnknownHostException {
ProvisionRequest request = createProvisionRequest();
request.getServiceElement().setServiceLevelAgreements(createClusterServiceLevelAgreements(false,
InetAddress.getLocalHost().getHostAddress()));
Collection<SystemComponent> notSupported = instantiatorResource.meetsQualitativeRequirements(request);
Assert.assertTrue(notSupported.size()==0);
}
@Test
public void testMeetsClusterMultipleHostNameRequirements() throws UnknownHostException {
ProvisionRequest request = createProvisionRequest();
request.getServiceElement().setServiceLevelAgreements(createClusterServiceLevelAgreements(false,
InetAddress.getLocalHost().getHostAddress(),
"192.168.1.9"));
Collection<SystemComponent> notSupported = instantiatorResource.meetsQualitativeRequirements(request);
Assert.assertTrue(notSupported.size()==0);
}
@Test
public void testMeetsExcludeClusterRequirements() throws UnknownHostException {
ProvisionRequest request = createProvisionRequest();
request.getServiceElement().setServiceLevelAgreements(createClusterServiceLevelAgreements(true,
InetAddress.getLocalHost().getHostAddress()));
Collection<SystemComponent> notSupported = instantiatorResource.meetsQualitativeRequirements(request);
Assert.assertTrue(notSupported.size()==1);
}
@Test
public void testMeetsExcludeMultipleClusterRequirements() throws UnknownHostException, ProvisionException {
ProvisionRequest request = createProvisionRequest();
request.getServiceElement().setServiceLevelAgreements(createClusterServiceLevelAgreements(true,
InetAddress.getLocalHost().getHostAddress(),
"192.168.1.9"));
Assert.assertFalse(instantiatorResource.canProvision(request));
}
@Test
public void testMeetsExcludeWithMatching() throws UnknownHostException, ProvisionException {
ProvisionRequest request = createProvisionRequest();
request.getServiceElement().setServiceLevelAgreements(createClusterServiceLevelAgreements(true, "10.0.1.33"));
Assert.assertTrue(instantiatorResource.canProvision(request));
}
ServiceElement createServiceElement() {
ServiceElement serviceElement = TestUtil.makeServiceElement("foo", "test", 1);
serviceElement.setServiceLevelAgreements(createServiceLevelAgreements(true, true));
return serviceElement;
}
ServiceLevelAgreements createServiceLevelAgreements(boolean matchArchitecture, boolean matchOpSys) {
String[] architectures;
if(matchArchitecture) {
architectures = new String[]{"x86", "x86_64"};
} else {
architectures = new String[]{"sparc", "amd"};
}
String[] operatingSystems;
if(matchOpSys) {
operatingSystems = new String[]{"Mac OS X", "Windows", "Linux"};
} else {
operatingSystems = new String[]{"ES/390", "Ubuntu"};
}
ServiceLevelAgreements slas = new ServiceLevelAgreements();
SystemRequirements systemRequirements = new SystemRequirements();
for (String architecture : architectures) {
SystemComponent systemComponent = new SystemComponent(ProcessorArchitecture.ID,
ProcessorArchitecture.class.getName());
systemComponent.put(ProcessorArchitecture.ARCHITECTURE, architecture);
systemRequirements.addSystemComponent(systemComponent);
}
for (String opSys : operatingSystems) {
SystemComponent operatingSystem = new SystemComponent(OperatingSystem.ID, OperatingSystem.class.getName());
operatingSystem.put(OperatingSystem.NAME, opSys);
systemRequirements.addSystemComponent(operatingSystem);
}
slas.setServiceRequirements(systemRequirements);
return slas;
}
ServiceLevelAgreements createClusterServiceLevelAgreements(boolean exclude, String... addresses) throws UnknownHostException {
ServiceLevelAgreements slas = new ServiceLevelAgreements();
SystemRequirements systemRequirements = new SystemRequirements();
slas.setServiceRequirements(systemRequirements);
for(String address : addresses) {
SystemComponent cluster = new SystemComponent(TCPConnectivity.ID);
cluster.put(TCPConnectivity.HOST_ADDRESS, address);
cluster.setExclude(exclude);
systemRequirements.addSystemComponent(cluster);
}
return slas;
}
ProvisionRequest createProvisionRequest() {
return new ProvisionRequest(service,
new ProvisionListener() {
public void serviceProvisioned(ServiceBeanInstance serviceBeanInstance,
InstantiatorResource resource) {
}
@Override
public void uninstantiable(ProvisionRequest request) {
}
},
manager,
new InstanceIDManager() {
@Override
public long getNextInstanceID() {
return 0;
}
}
);
}
class SBI implements ServiceBeanInstantiator, Serializable {
final Uuid uuid = UuidFactory.generate();
final InetAddress inetAddress;
SBI() throws UnknownHostException {
inetAddress = InetAddress.getLocalHost();
}
public DeployedService instantiate(ServiceProvisionEvent event) throws ServiceBeanInstantiationException,
UnknownEventException {
return null;
}
public void update(ServiceElement[] sElements, OperationalStringManager opStringMgr) {
}
public ServiceStatement[] getServiceStatements() {
return new ServiceStatement[0];
}
public ServiceStatement getServiceStatement(ServiceElement sElem) {
return null;
}
public ServiceRecord[] getServiceRecords(int filter) {
return new ServiceRecord[0];
}
public ServiceBeanInstance[] getServiceBeanInstances(ServiceElement element) {
return new ServiceBeanInstance[0];
}
public String getName() throws RemoteException {
return "test";
}
public Uuid getInstantiatorUuid() throws RemoteException {
return uuid;
}
public InetAddress getInetAddress() {
return inetAddress;
}
}
}