/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.server.resource.metadata.test; import java.util.List; import java.util.Map; import java.util.Set; import javax.transaction.Status; import org.testng.annotations.Test; import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; import org.rhq.core.domain.configuration.definition.PropertyDefinition; import org.rhq.core.domain.configuration.definition.PropertyDefinitionEnumeration; import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple; import org.rhq.core.domain.content.PackageType; import org.rhq.core.domain.operation.OperationDefinition; import org.rhq.core.domain.resource.ResourceType; /** * Note, plugins are registered in new transactions. for tests, this means * you can't do everything in a trans and roll back at the end. You must clean up manually. */ public class UpdateOperationsSubsystemTest extends UpdatePluginMetadataTestBase { private static final boolean ENABLED = true; @Override protected String getSubsystemDirectory() { return "operation"; } /** * Check updates of artifacts and operations * * @throws Exception */ @Test(enabled = ENABLED) public void testOperationAndArtifactUpdates() throws Exception { System.out.println("= testOperationAndArtifactUpdates"); try { registerPlugin("update3-v1_0.xml"); ResourceType platform1 = getResourceType("myPlatform3"); getTransactionManager().begin(); platform1 = em.find(ResourceType.class, platform1.getId()); Set<PackageType> packageTypes = platform1.getPackageTypes(); assert packageTypes.size() == 3 : "Did not find the three expected package types in v1"; Set<OperationDefinition> ops = platform1.getOperationDefinitions(); assert ops.size() == 3 : "Did not find three expected operations in v1"; getTransactionManager().rollback(); /* * Now deploy the changed version of the plugin */ registerPlugin("update3-v2_0.xml"); ResourceType platform2 = getResourceType("myPlatform3"); getTransactionManager().begin(); platform2 = em.find(ResourceType.class, platform2.getId()); Set<PackageType> packageTypes2 = platform2.getPackageTypes(); assert packageTypes2.size() == 3 : "Did not find the expected three package types in v2"; Set<OperationDefinition> opDefs = platform2.getOperationDefinitions(); assert opDefs.size() == 3 : "Did not find the three expected operations in v2"; // now that the basics are tested, go for the details... boolean ubuFound = false; for (PackageType pt : packageTypes2) { // System.out.println(at.getName()); assert !(pt.getName().equals("rpm")) : "RPM should be gone in v2"; if (pt.getName().equals("ubu")) { ubuFound = true; } } assert ubuFound == true : "Ubu should be in v2"; boolean startFound = false; for (OperationDefinition opDef : opDefs) { // System.out.println(opDef.getName()); assert !(opDef.getName().equals("restart")) : "Restart should be gone in v2"; if (opDef.getName().equals("start")) { startFound = true; } if (opDef.getName().equals("status")) { assert opDef.getDescription().equals("Yadda!") : "Description for 'start' should be 'Yadda!', but was " + opDef.getDescription(); } } assert startFound == true : "Start should be in v2"; getTransactionManager().rollback(); /* * Now try the other way round */ registerPlugin("update3-v1_0.xml", "3.0"); ResourceType platform3 = getResourceType("myPlatform3"); getTransactionManager().begin(); platform3 = em.find(ResourceType.class, platform3.getId()); Set<PackageType> packageTypes3 = platform3.getPackageTypes(); assert packageTypes3.size() == 3 : "Did not find the three package types in v3"; Set<OperationDefinition> ops3 = platform3.getOperationDefinitions(); assert ops3.size() == 3 : "Did not find three expected operations in v3"; // we should have rpm, deb, mpkg. ubu from v2 should be gone again. boolean rpmFound = false; for (PackageType pt : packageTypes3) { System.out.println(pt.getName()); assert !(pt.getName().equals("ubu")) : "ubu should be gone in v3"; if (pt.getName().equals("rpm")) { rpmFound = true; } } assert rpmFound == true : "rpm should be in v3"; } finally { if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) { getTransactionManager().rollback(); } } } @Test(enabled = ENABLED) public void testAddRemoveOperationWithParams() throws Exception { System.out.println("= testAddRemoveOperationWithParams"); try { registerPlugin("operation1-1.xml"); ResourceType platform = getResourceType("ops"); assert platform != null; getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); Set<OperationDefinition> opDefs = platform.getOperationDefinitions(); assert opDefs != null; assert opDefs.size() == 1; OperationDefinition def = opDefs.iterator().next(); assert def.getName().equals("sleep"); assert def.getParametersConfigurationDefinition() == null; getTransactionManager().rollback(); System.out.println("==> Done with v1"); registerPlugin("operation1-2.xml"); platform = getResourceType("ops"); assert platform != null; getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); opDefs = platform.getOperationDefinitions(); assert opDefs != null; assert opDefs.size() == 2; for (OperationDefinition odef : opDefs) { if (odef.getName().equals("invokeSql")) { assert odef.getDescription().startsWith("Execute"); ConfigurationDefinition conf = odef.getParametersConfigurationDefinition(); assert conf != null; Map<String, PropertyDefinition> props = conf.getPropertyDefinitions(); assert props.size() == 2; for (PropertyDefinition pd : props.values()) { PropertyDefinitionSimple pds = (PropertyDefinitionSimple) pd; if (pds.getName().equals("sleep")) { assert pds.getDescription() == null; } if (pds.getName().equals("invokeSql")) { List<PropertyDefinitionEnumeration> pde = pds.getEnumeratedValues(); assert pde.size() == 2; } } conf = odef.getResultsConfigurationDefinition(); assert conf != null; } } getTransactionManager().rollback(); System.out.println("==> Done with v2"); registerPlugin("operation1-1.xml", "3.0"); platform = getResourceType("ops"); assert platform != null; getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); opDefs = platform.getOperationDefinitions(); assert opDefs != null; assert opDefs.size() == 1; } finally { if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) { getTransactionManager().rollback(); } } } @Test(enabled = ENABLED) public void testAddRemoveOperationWithParams2() throws Exception { System.out.println("= testAddRemoveOperationWithParams2"); try { registerPlugin("operation2-1.xml"); ResourceType platform = getResourceType("ops"); assert platform != null; getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); Set<OperationDefinition> opDefs = platform.getOperationDefinitions(); assert opDefs != null; assert opDefs.size() == 3 : "Did not find the expected 3 defs, but " + opDefs.size(); int found = 0; for (OperationDefinition def : opDefs) { if (containedIn(def.getName(), new String[] { "sleep", "wakeup", "getup" })) found++; } assert found == 3 : "Did not find all 3 expected operations"; getTransactionManager().rollback(); System.out.println("==> Done with v1"); registerPlugin("operation2-1.xml"); System.out.println("==> Done with v1 (2)"); registerPlugin("operation2-2.xml"); platform = getResourceType("ops"); assert platform != null; getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); opDefs = platform.getOperationDefinitions(); assert opDefs != null; assert opDefs.size() == 4 : "Did not find the expected 4 defs, but " + opDefs.size(); found = 0; for (OperationDefinition def : opDefs) { if (containedIn(def.getName(), new String[] { "wakeup", "getup", "eat", "goToWork" })) found++; } assert found == 4 : "Did not find all 4 expected operations"; getTransactionManager().rollback(); System.out.println("==> Done with v2"); registerPlugin("operation2-1.xml", "3.0"); platform = getResourceType("ops"); assert platform != null; getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); opDefs = platform.getOperationDefinitions(); assert opDefs != null; assert opDefs.size() == 3 : "Did not find the expected 3 defs, but " + opDefs.size(); } finally { if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) { getTransactionManager().rollback(); } } } @Test(enabled = ENABLED) public void testAddRemoveOperationWithGrouping() throws Exception { System.out.println("= testAddRemoveOperationWithGrouping"); try { registerPlugin("operation3-1.xml"); ResourceType platform = getResourceType("ops"); assert platform != null; getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); Set<OperationDefinition> opDefs = platform.getOperationDefinitions(); assert opDefs != null; assert opDefs.size() == 3 : "Did not find the expected 3 defs, but " + opDefs.size(); int found = 0; for (OperationDefinition def : opDefs) { if (containedIn(def.getName(), new String[] { "sleep", "wakeup", "getup" })) found++; } assert found == 3 : "Did not find all 3 expected operations"; getTransactionManager().rollback(); System.out.println("==> Done with v1"); registerPlugin("operation3-1.xml"); System.out.println("==> Done with v1 (2)"); registerPlugin("operation3-2.xml"); platform = getResourceType("ops"); assert platform != null; getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); opDefs = platform.getOperationDefinitions(); assert opDefs != null; assert opDefs.size() == 4 : "Did not find the expected 4 defs, but " + opDefs.size(); found = 0; for (OperationDefinition def : opDefs) { if (containedIn(def.getName(), new String[] { "wakeup", "getup", "eat", "goToWork" })) found++; } assert found == 4 : "Did not find all 4 expected operations"; getTransactionManager().rollback(); System.out.println("==> Done with v2"); registerPlugin("operation3-1.xml", "3.0"); platform = getResourceType("ops"); assert platform != null; getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); opDefs = platform.getOperationDefinitions(); assert opDefs != null; assert opDefs.size() == 3 : "Did not find the expected 3 defs, but " + opDefs.size(); } finally { if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) { getTransactionManager().rollback(); } } } }