private void cleanupOrphanedSecurityGroupsInZone(Set<String> groups, String zoneId) { Optional<? extends SecurityGroupApi> securityGroupApi = novaApi.getSecurityGroupExtensionForZone(zoneId); if (securityGroupApi.isPresent()) { for (String group : groups) { for (SecurityGroup securityGroup : Iterables.filter(securityGroupApi.get().list(), SecurityGroupPredicates.nameMatches(namingConvention.create().containsGroup(group)))) { ZoneAndName zoneAndName = ZoneAndName.fromZoneAndName(zoneId, securityGroup.getName()); logger.debug(">> deleting securityGroup(%s)", zoneAndName); securityGroupApi.get().delete(securityGroup.getId()); // TODO: test this clear happens securityGroupMap.invalidate(zoneAndName); logger.debug("<< deleted securityGroup(%s)", zoneAndName); } } } }
private void cleanupOrphanedSecurityGroupsInZone(Set<String> groups, String zoneId) { Optional<? extends SecurityGroupApi> securityGroupApi = novaApi.getSecurityGroupExtensionForZone(zoneId); if (securityGroupApi.isPresent()) { for (String group : groups) { for (SecurityGroup securityGroup : Iterables.filter(securityGroupApi.get().list(), SecurityGroupPredicates.nameMatches(namingConvention.create().containsGroup(group)))) { ZoneAndName zoneAndName = ZoneAndName.fromZoneAndName(zoneId, securityGroup.getName()); logger.debug(">> deleting securityGroup(%s)", zoneAndName); securityGroupApi.get().delete(securityGroup.getId()); // TODO: test this clear happens securityGroupMap.invalidate(zoneAndName); logger.debug("<< deleted securityGroup(%s)", zoneAndName); } } } }
private void cleanupOrphanedSecurityGroupsInZone(Set<String> groups, String zoneId) { Optional<? extends SecurityGroupApi> securityGroupApi = novaApi.getSecurityGroupExtensionForZone(zoneId); if (securityGroupApi.isPresent()) { for (String group : groups) { for (SecurityGroup securityGroup : Iterables.filter(securityGroupApi.get().list(), SecurityGroupPredicates.nameMatches(namingConvention.create().containsGroup(group)))) { ZoneAndName zoneAndName = ZoneAndName.fromZoneAndName(zoneId, securityGroup.getName()); logger.debug(">> deleting securityGroup(%s)", zoneAndName); securityGroupApi.get().delete(securityGroup.getId()); // TODO: test this clear happens securityGroupMap.invalidate(zoneAndName); logger.debug("<< deleted securityGroup(%s)", zoneAndName); } } } }
public void testPropertyChangesDelimiter() { GroupNamingConvention fn = Guice.createInjector(new AbstractModule() { @Override protected void configure() { bindConstant().annotatedWith(Names.named(RESOURCENAME_DELIMITER)).to('#'); } }).getInstance(GroupNamingConvention.Factory.class).create(); assertEquals(fn.sharedNameForGroup("cluster"), "jclouds#cluster"); assertEquals(fn.groupInSharedNameOrNull("jclouds#cluster"), "cluster"); assertEquals(fn.groupInUniqueNameOrNull("jclouds#cluster"), null); assertTrue(fn.containsGroup("cluster").apply("jclouds#cluster")); }
public void testPropertyChangesDelimiter() { GroupNamingConvention fn = Guice.createInjector(new AbstractModule() { @Override protected void configure() { bindConstant().annotatedWith(Names.named(RESOURCENAME_DELIMITER)).to('#'); } }).getInstance(GroupNamingConvention.Factory.class).create(); assertEquals(fn.sharedNameForGroup("cluster"), "jclouds#cluster"); assertEquals(fn.groupInSharedNameOrNull("jclouds#cluster"), "cluster"); assertEquals(fn.groupInUniqueNameOrNull("jclouds#cluster"), null); assertTrue(fn.containsGroup("cluster").apply("jclouds#cluster")); }
public void testPropertyChangesPrefix() { GroupNamingConvention fn = Guice.createInjector(new AbstractModule() { @Override protected void configure() { bindConstant().annotatedWith(Names.named(RESOURCENAME_PREFIX)).to("kclouds"); } }).getInstance(GroupNamingConvention.Factory.class).create(); assertEquals(fn.sharedNameForGroup("cluster"), "kclouds-cluster"); assertEquals(fn.groupInSharedNameOrNull("kclouds-cluster"), "cluster"); assertEquals(fn.groupInUniqueNameOrNull("kclouds-cluster"), null); assertTrue(fn.containsGroup("cluster").apply("kclouds-cluster")); }
public void testPropertyChangesPrefix() { GroupNamingConvention fn = Guice.createInjector(new AbstractModule() { @Override protected void configure() { bindConstant().annotatedWith(Names.named(RESOURCENAME_PREFIX)).to("kclouds"); } }).getInstance(GroupNamingConvention.Factory.class).create(); assertEquals(fn.sharedNameForGroup("cluster"), "kclouds-cluster"); assertEquals(fn.groupInSharedNameOrNull("kclouds-cluster"), "cluster"); assertEquals(fn.groupInUniqueNameOrNull("kclouds-cluster"), null); assertTrue(fn.containsGroup("cluster").apply("kclouds-cluster")); }
@VisibleForTesting void deleteKeyPair(String region, String group) { for (KeyPair keyPair : client.getKeyPairApi().get().describeKeyPairsInRegionWithFilter(region, ImmutableMultimap.<String, String>builder() .put("key-name", String.format("jclouds#%s#*", group).replace('#', delimiter)) .build())) { String keyName = keyPair.getKeyName(); Predicate<String> keyNameMatcher = namingConvention.create().containsGroup(group); String oldKeyNameRegex = String.format("jclouds#%s#%s#%s", group, region, "[0-9a-f]+").replace('#', delimiter); // old keypair pattern too verbose as it has an unnecessary region qualifier if (keyNameMatcher.apply(keyName) || keyName.matches(oldKeyNameRegex)) { Set<String> instancesUsingKeyPair = extractIdsFromInstances(concat(client.getInstanceApi().get() .describeInstancesInRegionWithFilter(region, ImmutableMultimap.<String, String>builder() .put("instance-state-name", InstanceState.TERMINATED.toString()) .put("instance-state-name", InstanceState.SHUTTING_DOWN.toString()) .put("key-name", keyPair.getKeyName()).build()))); if (!instancesUsingKeyPair.isEmpty()) { logger.debug("<< inUse keyPair(%s), by (%s)", keyPair.getKeyName(), instancesUsingKeyPair); } else { logger.debug(">> deleting keyPair(%s)", keyPair.getKeyName()); client.getKeyPairApi().get().deleteKeyPairInRegion(region, keyPair.getKeyName()); // TODO: test this clear happens credentialsMap.remove(new RegionAndName(region, keyPair.getKeyName())); credentialsMap.remove(new RegionAndName(region, group)); logger.debug("<< deleted keyPair(%s)", keyPair.getKeyName()); } } } }
private void cleanupOrphanedKeyPairsInZone(Set<String> groups, String zoneId) { Optional<? extends KeyPairApi> keyPairApi = novaApi.getKeyPairExtensionForZone(zoneId); if (keyPairApi.isPresent()) { for (String group : groups) { for (KeyPair pair : keyPairApi.get().list().filter(nameMatches(namingConvention.create().containsGroup(group)))) { ZoneAndName zoneAndName = ZoneAndName.fromZoneAndName(zoneId, pair.getName()); logger.debug(">> deleting keypair(%s)", zoneAndName); keyPairApi.get().delete(pair.getName()); // TODO: test this clear happens keyPairCache.invalidate(zoneAndName); logger.debug("<< deleted keypair(%s)", zoneAndName); } keyPairCache.invalidate(ZoneAndName.fromZoneAndName(zoneId, namingConvention.create().sharedNameForGroup(group))); } } }
private void cleanupOrphanedKeyPairsInZone(Set<String> groups, String zoneId) { Optional<? extends KeyPairApi> keyPairApi = novaApi.getKeyPairExtensionForZone(zoneId); if (keyPairApi.isPresent()) { for (String group : groups) { for (KeyPair pair : keyPairApi.get().list().filter(nameMatches(namingConvention.create().containsGroup(group)))) { ZoneAndName zoneAndName = ZoneAndName.fromZoneAndName(zoneId, pair.getName()); logger.debug(">> deleting keypair(%s)", zoneAndName); keyPairApi.get().delete(pair.getName()); // TODO: test this clear happens keyPairCache.invalidate(zoneAndName); logger.debug("<< deleted keypair(%s)", zoneAndName); } keyPairCache.invalidate(ZoneAndName.fromZoneAndName(zoneId, namingConvention.create().sharedNameForGroup(group))); } } }
public void testCanChangeSuffixSupplier() { GroupNamingConvention fn = Guice.createInjector(new AbstractModule() { @Override protected void configure() { bind(new TypeLiteral<Supplier<String>>() { }).toInstance(Suppliers.ofInstance("foo")); } }).getInstance(GroupNamingConvention.Factory.class).create(); assertEquals(fn.uniqueNameForGroup("cluster"), "jclouds-cluster-foo"); // note accidental treatment of a unique node as a shared one can lead to // incorrect group names, as long as we permit delimiter to be in group name assertEquals(fn.groupInSharedNameOrNull("jclouds-cluster-foo"), "cluster-foo"); assertEquals(fn.groupInUniqueNameOrNull("jclouds-cluster-foo"), "cluster"); assertTrue(fn.containsGroup("cluster").apply("jclouds-cluster-foo")); }
private void cleanupOrphanedSecurityGroupsInZone(Set<String> groups, String zoneId) { Zone zone = zoneIdToZone.get().getUnchecked(zoneId); if (supportsSecurityGroups().apply(zone)) { for (String group : groups) { for (SecurityGroup securityGroup : Iterables.filter(client.getSecurityGroupApi().listSecurityGroups(), SecurityGroupPredicates.nameMatches(namingConvention.create().containsGroup(group)))) { ZoneAndName zoneAndName = ZoneAndName.fromZoneAndName(zoneId, securityGroup.getName()); logger.debug(">> deleting securityGroup(%s)", zoneAndName); client.getSecurityGroupApi().deleteSecurityGroup(securityGroup.getId()); // TODO: test this clear happens securityGroupMap.invalidate(zoneAndName); logger.debug("<< deleted securityGroup(%s)", zoneAndName); } } } }
private void cleanupOrphanedKeyPairsInZone(Set<String> groups, String zoneId) { Optional<? extends KeyPairApi> keyPairApi = novaApi.getKeyPairExtensionForZone(zoneId); if (keyPairApi.isPresent()) { for (String group : groups) { for (KeyPair pair : keyPairApi.get().list().filter(nameMatches(namingConvention.create().containsGroup(group)))) { ZoneAndName zoneAndName = ZoneAndName.fromZoneAndName(zoneId, pair.getName()); logger.debug(">> deleting keypair(%s)", zoneAndName); keyPairApi.get().delete(pair.getName()); // TODO: test this clear happens keyPairCache.invalidate(zoneAndName); logger.debug("<< deleted keypair(%s)", zoneAndName); } keyPairCache.invalidate(ZoneAndName.fromZoneAndName(zoneId, namingConvention.create().sharedNameForGroup(group))); } } }
public void testCanChangeSuffixSupplier() { GroupNamingConvention fn = Guice.createInjector(new AbstractModule() { @Override protected void configure() { bind(new TypeLiteral<Supplier<String>>() { }).toInstance(Suppliers.ofInstance("foo")); } }).getInstance(GroupNamingConvention.Factory.class).create(); assertEquals(fn.uniqueNameForGroup("cluster"), "jclouds-cluster-foo"); // note accidental treatment of a unique node as a shared one can lead to // incorrect group names, as long as we permit delimiter to be in group name assertEquals(fn.groupInSharedNameOrNull("jclouds-cluster-foo"), "cluster-foo"); assertEquals(fn.groupInUniqueNameOrNull("jclouds-cluster-foo"), "cluster"); assertTrue(fn.containsGroup("cluster").apply("jclouds-cluster-foo")); }
@VisibleForTesting void deleteKeyPair(String region, String group) { for (KeyPair keyPair : client.getKeyPairServices().describeKeyPairsInRegion(region)) { String keyName = keyPair.getKeyName(); Predicate<String> keyNameMatcher = namingConvention.create().containsGroup(group); String oldKeyNameRegex = String.format("jclouds#%s#%s#%s", group, region, "[0-9a-f]+").replace('#', delimiter); // old keypair pattern too verbose as it has an unnecessary region qualifier if (keyNameMatcher.apply(keyName) || keyName.matches(oldKeyNameRegex)) { Set<String> instancesUsingKeyPair = extractIdsFromInstances(filter(concat(client.getInstanceServices() .describeInstancesInRegion(region)), usingKeyPairAndNotDead(keyPair))); if (instancesUsingKeyPair.size() > 0) { logger.debug("<< inUse keyPair(%s), by (%s)", keyPair.getKeyName(), instancesUsingKeyPair); } else { logger.debug(">> deleting keyPair(%s)", keyPair.getKeyName()); client.getKeyPairServices().deleteKeyPairInRegion(region, keyPair.getKeyName()); // TODO: test this clear happens credentialsMap.remove(new RegionAndName(region, keyPair.getKeyName())); credentialsMap.remove(new RegionAndName(region, group)); logger.debug("<< deleted keyPair(%s)", keyPair.getKeyName()); } } } }
@VisibleForTesting void deleteKeyPair(String region, String group) { for (KeyPair keyPair : client.getKeyPairServices().describeKeyPairsInRegion(region)) { String keyName = keyPair.getKeyName(); Predicate<String> keyNameMatcher = namingConvention.create().containsGroup(group); String oldKeyNameRegex = String.format("jclouds#%s#%s#%s", group, region, "[0-9a-f]+").replace('#', delimiter); // old keypair pattern too verbose as it has an unnecessary region qualifier if (keyNameMatcher.apply(keyName) || keyName.matches(oldKeyNameRegex)) { Set<String> instancesUsingKeyPair = extractIdsFromInstances(filter(concat(client.getInstanceServices() .describeInstancesInRegion(region)), usingKeyPairAndNotDead(keyPair))); if (instancesUsingKeyPair.size() > 0) { logger.debug("<< inUse keyPair(%s), by (%s)", keyPair.getKeyName(), instancesUsingKeyPair); } else { logger.debug(">> deleting keyPair(%s)", keyPair.getKeyName()); client.getKeyPairServices().deleteKeyPairInRegion(region, keyPair.getKeyName()); // TODO: test this clear happens credentialsMap.remove(new RegionAndName(region, keyPair.getKeyName())); credentialsMap.remove(new RegionAndName(region, group)); logger.debug("<< deleted keyPair(%s)", keyPair.getKeyName()); } } } }
private void cleanupOrphanedKeyPairsInZone(Set<String> groups, String zoneId) { for (String group : groups) { for (SshKeyPair pair : Iterables.filter(client.getSSHKeyPairApi().listSSHKeyPairs(), nameMatches(namingConvention.create().containsGroup(group)))) { logger.debug(">> deleting keypair(%s)", pair.getName()); client.getSSHKeyPairApi().deleteSSHKeyPair(pair.getName()); // TODO: test this clear happens keyPairCache.invalidate(pair.getName()); logger.debug("<< deleted keypair(%s)", pair.getName()); } keyPairCache.invalidate(namingConvention.create().sharedNameForGroup(group)); } }
private void cleanupOrphanedKeysInZone(Set<String> groups, String datacenterId) { KeyApi keyApi = novaApi.getKeyApi(); for (String group : groups) { for (Key key : Iterables.filter(keyApi.list(), KeyPredicates.nameMatches(namingConvention.create().containsGroup(group)))) { DatacenterAndName datacenterAndName = DatacenterAndName.fromDatacenterAndName(datacenterId, key.getName()); logger.debug(">> deleting key(%s)", datacenterAndName); keyApi.delete(key.getName()); // TODO: test this clear happens keyCache.invalidate(datacenterAndName); logger.debug("<< deleted key(%s)", datacenterAndName); } keyCache.invalidate(DatacenterAndName.fromDatacenterAndName(datacenterId, namingConvention.create() .sharedNameForGroup(group))); } }
private void cleanupOrphanedKeysInZone(Set<String> groups, String datacenterId) { KeyClient keyClient = novaClient.getKeyClient(); for (String group : groups) { for (Key key : Iterables.filter(keyClient.list(), KeyPredicates.nameMatches(namingConvention.create().containsGroup(group)))) { DatacenterAndName datacenterAndName = DatacenterAndName.fromDatacenterAndName(datacenterId, key.getName()); logger.debug(">> deleting key(%s)", datacenterAndName); keyClient.delete(key.getName()); // TODO: test this clear happens keyCache.invalidate(datacenterAndName); logger.debug("<< deleted key(%s)", datacenterAndName); } keyCache.invalidate(DatacenterAndName.fromDatacenterAndName(datacenterId, namingConvention.create() .sharedNameForGroup(group))); } }
private void cleanupOrphanedKeysInZone(Set<String> groups, String datacenterId) { KeyApi keyApi = novaApi.getKeyApi(); for (String group : groups) { for (Key key : Iterables.filter(keyApi.list(), KeyPredicates.nameMatches(namingConvention.create().containsGroup(group)))) { DatacenterAndName datacenterAndName = DatacenterAndName.fromDatacenterAndName(datacenterId, key.getName()); logger.debug(">> deleting key(%s)", datacenterAndName); keyApi.delete(key.getName()); // TODO: test this clear happens keyCache.invalidate(datacenterAndName); logger.debug("<< deleted key(%s)", datacenterAndName); } keyCache.invalidate(DatacenterAndName.fromDatacenterAndName(datacenterId, namingConvention.create() .sharedNameForGroup(group))); } }