/** Walks the contents of a ManagementContext, to create a corresponding memento. */ public static BrooklynMemento newBrooklynMemento(ManagementContext managementContext) { BrooklynMementoImpl.Builder builder = BrooklynMementoImpl.builder(); for (Application app : managementContext.getApplications()) { builder.applicationIds.add(app.getId()); } for (Entity entity : managementContext.getEntityManager().getEntities()) { builder.entities.put( entity.getId(), ((EntityInternal) entity).getRebindSupport().getMemento()); for (Location location : entity.getLocations()) { if (!builder.locations.containsKey(location.getId())) { for (Location locationInHierarchy : TreeUtils.findLocationsInHierarchy(location)) { if (!builder.locations.containsKey(locationInHierarchy.getId())) { builder.locations.put( locationInHierarchy.getId(), ((LocationInternal) locationInHierarchy).getRebindSupport().getMemento()); } } } } } for (LocationMemento memento : builder.locations.values()) { if (memento.getParent() == null) { builder.topLevelLocationIds.add(memento.getId()); } } BrooklynMemento result = builder.build(); MementoValidators.validateMemento(result); return result; }
@Test public void testResolvesPropertiesInSpec() throws Exception { Location location = resolve("localhost(privateKeyFile=myprivatekeyfile,name=myname)"); assertTrue(location instanceof LocalhostMachineProvisioningLocation); assertEquals(location.getDisplayName(), "myname"); assertEquals(location.getAllConfig(true).get("privateKeyFile"), "myprivatekeyfile"); }
public void addChild(Location child) { // Previously, setParent delegated to addChildLocation and we sometimes ended up with // duplicate entries here. Instead this now uses a similar scheme to // AbstractLocation.setParent/addChild (with any weaknesses for distribution that such a // scheme might have...). // // We continue to use a list to allow identical-looking locations, but they must be different // instances. synchronized (children) { for (Location contender : children) { if (contender == child) { // don't re-add; no-op return; } } children.add(child); } if (isManaged()) { Locations.manage(child, managementContext); } else if (managementContext != null) { if (((LocalLocationManager) managementContext.getLocationManager()) .getLocationEvenIfPreManaged(child.getId()) == null) { ((ManagementContextInternal) managementContext).prePreManage(child); } } children.add(child); child.setParent(this); }
public boolean containsLocation(Location potentialDescendent) { Location loc = potentialDescendent; while (loc != null) { if (this == loc) return true; loc = loc.getParentLocation(); } return false; }
public boolean equals(Object o) { if (!(o instanceof Location)) { return false; } Location l = (Location) o; return getId().equals(l.getId()); }
@Test public void testResolvesDefaultName() throws Exception { Location location = resolve("localhost"); assertTrue(location instanceof LocalhostMachineProvisioningLocation); assertEquals(location.getDisplayName(), "localhost"); Location location2 = resolve("localhost()"); assertTrue(location2 instanceof LocalhostMachineProvisioningLocation); assertEquals(location2.getDisplayName(), "localhost"); }
@Override @Deprecated public Object findLocationProperty(String key) { if (hasLocationProperty(key)) return getLocationProperty(key); if (parentLocation != null) return parentLocation.findLocationProperty(key); return null; }
@Override public void onManageLocationFailed(Location location, Exception e) { manageLocationFailures.put( location, new IllegalStateException( "problem managing location " + location.getId() + " (" + location + ")", e)); super.onManageLocationFailed(location, e); }
@Override public PortMapping getPortMappingWithPrivateSide(Location l, int privatePort) { synchronized (mutex) { for (PortMapping m : mappings.values()) if (l.equals(m.getTarget()) && privatePort == m.privatePort) return m; } return null; }
/** returns the subset of port mappings associated with a given location */ @Override public Collection<PortMapping> getLocationPublicIpIds(Location l) { List<PortMapping> result = new ArrayList<PortMapping>(); synchronized (mutex) { for (PortMapping m : mappings.values()) if (l.equals(m.getTarget())) result.add(m); } return result; }
@Override public HostAndPort lookup(Location l, int privatePort) { synchronized (mutex) { for (PortMapping m : mappings.values()) { if (l.equals(m.target) && privatePort == m.privatePort) return getPublicHostAndPort(m); } } return null; }
protected boolean removeChildLocation(Location child) { boolean removed = childLocations.remove(child); if (removed) { if (child instanceof Closeable) { Closeables.closeQuietly((Closeable) child); } child.setParentLocation(null); } return removed; }
@Test public void testCheckPointAndLoadMemento() throws IOException, TimeoutException, InterruptedException { BrooklynMemento reloadedMemento = loadMemento(); assertNotNull(reloadedMemento); assertTrue(Iterables.contains(reloadedMemento.getEntityIds(), entity.getId())); assertEquals(Iterables.getOnlyElement(reloadedMemento.getLocationIds()), location.getId()); assertEquals(Iterables.getOnlyElement(reloadedMemento.getPolicyIds()), policy.getId()); assertEquals(Iterables.getOnlyElement(reloadedMemento.getEnricherIds()), enricher.getId()); }
@Test public void testDeleteAndLoadMemento() throws TimeoutException, InterruptedException, IOException { Entities.destroy(entity); BrooklynMemento reloadedMemento = loadMemento(); assertNotNull(reloadedMemento); assertFalse(Iterables.contains(reloadedMemento.getEntityIds(), entity.getId())); assertEquals(Iterables.getOnlyElement(reloadedMemento.getLocationIds()), location.getId()); }
public static BasicLocationMemento.Builder newLocationMementoBuilder(Location location) { BasicLocationMemento.Builder builder = BasicLocationMemento.builder(); Set<String> nonPersistableFlagNames = MutableMap.<String, Object>builder() .putAll(FlagUtils.getFieldsWithFlagsWithModifiers(location, Modifier.TRANSIENT)) .putAll(FlagUtils.getFieldsWithFlagsWithModifiers(location, Modifier.STATIC)) .put("id", String.class) .filterValues(Predicates.not(Predicates.instanceOf(ConfigKey.class))) .build() .keySet(); Map<String, Object> persistableFlags = MutableMap.<String, Object>builder() .putAll( FlagUtils.getFieldsWithFlagsExcludingModifiers( location, Modifier.STATIC ^ Modifier.TRANSIENT)) .removeAll(nonPersistableFlagNames) .build(); ConfigBag persistableConfig = new ConfigBag() .copy(((AbstractLocation) location).getLocalConfigBag()) .removeAll(nonPersistableFlagNames); builder.type = location.getClass().getName(); builder.typeClass = location.getClass(); builder.id = location.getId(); builder.displayName = location.getDisplayName(); builder.copyConfig(persistableConfig); builder.locationConfig.putAll(persistableFlags); Location parentLocation = location.getParent(); builder.parent = (parentLocation != null) ? parentLocation.getId() : null; for (Location child : location.getChildren()) { builder.children.add(child.getId()); } return builder; }
protected boolean removeChild(Location child) { boolean removed; synchronized (children) { removed = children.remove(child); } if (removed) { if (child instanceof Closeable) { Streams.closeQuietly((Closeable) child); } child.setParent(null); if (isManaged()) { managementContext.getLocationManager().unmanage(child); } } return removed; }
public void addChildLocation(Location child) { // Previously, setParentLocation delegated to addChildLocation and we sometimes ended up with // duplicate entries here. Instead this now uses a similar scheme to // AbstractEntity.setParent/addChild (with any weaknesses for distribution that such a // scheme might have...). // // We continue to use a list to allow identical-looking locations, but they must be different // instances. for (Location contender : childLocations) { if (contender == child) { // don't re-add; no-op return; } } childLocations.add(child); child.setParentLocation(this); }
@Override public boolean forgetPortMappings(Location l) { List<PortMapping> result = Lists.newArrayList(); synchronized (mutex) { for (Iterator<PortMapping> iter = mappings.values().iterator(); iter.hasNext(); ) { PortMapping m = iter.next(); if (l.equals(m.target)) { iter.remove(); result.add(m); emitAssociationDeletedEvent(associationMetadataFromPortMapping(m)); } } } if (log.isDebugEnabled()) log.debug("cleared all port mappings for " + l + " - " + result); if (!result.isEmpty()) { onChanged(); } return !result.isEmpty(); }
public static BasicEntityMemento.Builder newEntityMementoBuilder(Entity entity) { EntityDynamicType definedType = EntityTypes.getDefinedEntityType(entity.getClass()); BasicEntityMemento.Builder builder = BasicEntityMemento.builder(); builder.id = entity.getId(); builder.displayName = entity.getDisplayName(); builder.type = entity.getClass().getName(); builder.typeClass = entity.getClass(); // TODO the dynamic attributeKeys and configKeys are computed in the BasicEntityMemento // whereas effectors are computed here -- should be consistent! // (probably best to compute attrKeys and configKeys here) builder.effectors.addAll(entity.getEntityType().getEffectors()); builder.effectors.removeAll(definedType.getEffectors().values()); builder.isTopLevelApp = (entity instanceof Application && entity.getParent() == null); Map<ConfigKey<?>, Object> localConfig = ((EntityInternal) entity).getConfigMap().getLocalConfig(); for (Map.Entry<ConfigKey<?>, Object> entry : localConfig.entrySet()) { ConfigKey<?> key = checkNotNull(entry.getKey(), localConfig); Object value = configValueToPersistable(entry.getValue()); builder.config.put(key, value); } Map<String, Object> localConfigUnmatched = MutableMap.copyOf( ((EntityInternal) entity).getConfigMap().getLocalConfigBag().getAllConfig()); for (ConfigKey<?> key : localConfig.keySet()) { localConfigUnmatched.remove(key.getName()); } for (Map.Entry<String, Object> entry : localConfigUnmatched.entrySet()) { String key = checkNotNull(entry.getKey(), localConfig); Object value = entry.getValue(); // TODO Not transforming; that code is deleted in another pending PR anyway! builder.configUnmatched.put(key, value); } @SuppressWarnings("rawtypes") Map<AttributeSensor, Object> allAttributes = ((EntityInternal) entity).getAllAttributes(); for (@SuppressWarnings("rawtypes") Map.Entry<AttributeSensor, Object> entry : allAttributes.entrySet()) { AttributeSensor<?> key = checkNotNull(entry.getKey(), allAttributes); Object value = entry.getValue(); builder.attributes.put((AttributeSensor<?>) key, value); } for (Location location : entity.getLocations()) { builder.locations.add(location.getId()); } for (Entity child : entity.getChildren()) { builder.children.add(child.getId()); } for (Policy policy : entity.getPolicies()) { builder.policies.add(policy.getId()); } for (Enricher enricher : entity.getEnrichers()) { builder.enrichers.add(enricher.getId()); } Entity parentEntity = entity.getParent(); builder.parent = (parentEntity != null) ? parentEntity.getId() : null; if (entity instanceof Group) { for (Entity member : ((Group) entity).getMembers()) { builder.members.add(member.getId()); } } return builder; }
@Test public void testWithOldStyleColon() throws Exception { Location location = resolve("localhost:(name=myname)"); assertTrue(location instanceof LocalhostMachineProvisioningLocation); assertEquals(location.getDisplayName(), "myname"); }