From d58bbcd0ed05b614d75176523dc53c284dfa2d5c Mon Sep 17 00:00:00 2001 From: Marek Wieczorek Date: Fri, 23 May 2014 15:52:59 +0200 Subject: [PATCH 1/2] JCLOUDS-620: Don't fail on tag filtering when group is not specified. Follow-up from 69756496 --- .../functions/InstanceInZoneToNodeMetadata.java | 6 +- .../InstanceInZoneToNodeMetadataTest.java | 286 +++++++++++++++++++++ 2 files changed, 290 insertions(+), 2 deletions(-) create mode 100644 google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadataTest.java diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadata.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadata.java index 99e2b6c..704e9ef 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadata.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadata.java @@ -84,8 +84,10 @@ public NodeMetadata apply(InstanceInZone instanceInZone) { String group = groupFromMapOrName(input.getMetadata().getItems(), input.getName(), nodeNamingConvention); - FluentIterable tags = FluentIterable.from(input.getTags().getItems()) - .filter(Predicates.not(firewallTagNamingConvention.get(group).isFirewallTag())); + FluentIterable tags = FluentIterable.from(input.getTags().getItems()); + if (group != null) { + tags = tags.filter(Predicates.not(firewallTagNamingConvention.get(group).isFirewallTag())); + } NodeMetadataBuilder builder = new NodeMetadataBuilder(); diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadataTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadataTest.java new file mode 100644 index 0000000..dd2416e --- /dev/null +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadataTest.java @@ -0,0 +1,286 @@ +/* + * 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.googlecomputeengine.compute.functions; + +import static org.easymock.EasyMock.createMock; +import static org.testng.Assert.assertEquals; +import static org.jclouds.compute.domain.Image.Status.AVAILABLE; + +import java.net.URI; +import java.util.Map; +import java.util.Set; + +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.HardwareBuilder; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.ImageBuilder; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.domain.Processor; +import org.jclouds.compute.domain.Volume.Type; +import org.jclouds.compute.domain.VolumeBuilder; +import org.jclouds.compute.functions.GroupNamingConvention; +import org.jclouds.date.internal.SimpleDateFormatDateService; +import org.jclouds.domain.Location; +import org.jclouds.domain.LocationBuilder; +import org.jclouds.domain.LocationScope; +import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; +import org.jclouds.googlecomputeengine.domain.Instance; +import org.jclouds.googlecomputeengine.domain.InstanceInZone; +import org.jclouds.googlecomputeengine.domain.Metadata; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Maps; + +@Test(groups = "unit", testName = "InstanceInZoneToNodeMetadataTest") +public class InstanceInZoneToNodeMetadataTest { + + /** + * GroupNamingConvention that always returns the same name provided in the constructor. + * The predicates returned always evaluate to true. + * + */ + class FixedGroupNamingConvention implements GroupNamingConvention { + private final String name; + + public FixedGroupNamingConvention(final String name) { + this.name = name; + } + + @Override + public String sharedNameForGroup(final String group) { + return name; + } + + @Override + public String uniqueNameForGroup(final String group) { + return name; + } + + @Override + public String groupInUniqueNameOrNull(final String encoded) { + return name; + } + + @Override + public String groupInSharedNameOrNull(final String encoded) { + return name; + } + + @Override + public Predicate containsGroup(final String group) { + return new Predicate() { + @Override + public boolean apply(final String input) { + return true; + } + }; + } + + @Override + public Predicate containsAnyGroup() { + return new Predicate() { + @Override + public boolean apply(final String input) { + return true; + } + }; + } + + @Override + public String extractGroup(final String encoded) { + return name; + } + } + + private Instance instance; + + private Set hardwares; + + private Set images; + + private Set locations; + + private InstanceInZoneToNodeMetadata groupGroupNodeParser; + private InstanceInZoneToNodeMetadata groupNullNodeParser; + + @BeforeMethod + public final void setup() { + instance = Instance.builder() + .id("13051190678907570425") + .creationTimestamp(new SimpleDateFormatDateService().iso8601DateParse("2012-11-25T23:48:20.758")) + .selfLink(URI.create("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/instances/test-0")) + .description("desc") + .name("test-0") + .machineType(URI.create("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/" + + "machineTypes/n1-standard-1")) + .status(Instance.Status.RUNNING) + .zone(URI.create("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a")) + .addNetworkInterface( + Instance.NetworkInterface.builder() + .name("nic0") + .networkIP("10.240.121.115") + .network(URI.create("https://www.googleapis" + + ".com/compute/v1/projects/myproject/global/networks/default")) + .build()) + .addDisk( + Instance.PersistentAttachedDisk.builder() + .index(0) + .mode(Instance.PersistentAttachedDisk.Mode.READ_WRITE) + .deviceName("test") + .source(URI.create("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/disks/test")) + .boot(true) + .build()) + .tags(Instance.Tags.builder().fingerprint("abcd").addItem("aTag").addItem("Group-port-42").build()) + .metadata(Metadata.builder() + .items(ImmutableMap.of("aKey", "aValue", + "jclouds-image", + "https://www.googleapis.com/compute/v1/projects/centos-cloud/global/images/gcel-12-04-v20121106", + "jclouds-delete-boot-disk", "true")) + .fingerprint("efgh") + .build()) + .addServiceAccount(Instance.ServiceAccount.builder().email("default").addScopes("myscope").build()) + .build(); + + images = ImmutableSet.of(new ImageBuilder() + .id("1") + .uri(URI.create("https://www.googleapis.com/compute/v1/projects/centos-cloud/global/images/" + + "gcel-12-04-v20121106")) + .providerId("1") + .name("mock image") + .status(AVAILABLE) + .operatingSystem( + OperatingSystem.builder().name("Ubuntu 14.04 x86_64").description("Ubuntu").family(OsFamily.UBUNTU) + .version("10.04").arch("x86_64").is64Bit(true).build()).build()); + + hardwares = ImmutableSet.of(new HardwareBuilder().id("my_id") + .uri(URI.create("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/machineTypes/" + + "n1-standard-1")) + .providerId("1") + .name("mock hardware").processor(new Processor(1.0, 1.0)).ram(2048) + .volume(new VolumeBuilder().size(20f).type(Type.LOCAL).build()).build()); + + locations = ImmutableSet.of(new LocationBuilder() + .id("id") + .description("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a") + .scope(LocationScope.REGION) + .parent( + new LocationBuilder().id("0").description("mock parent location").scope(LocationScope.PROVIDER) + .build()).build()); + + groupGroupNodeParser = createNodeParser(hardwares, images, locations, "Group"); + groupNullNodeParser = createNodeParser(hardwares, images, locations, null); + } + + private InstanceInZoneToNodeMetadata createNodeParser(final Set hardware, final Set images, + final Set locations, final String groupName) { + Supplier> locationSupplier = new Supplier>() { + @Override + public Map get() { + return Maps.uniqueIndex(locations, new Function() { + @Override + public URI apply(final Location input) { + return URI.create(input.getDescription()); + } + }); + } + }; + + Supplier> hardwareSupplier = new Supplier>() { + @Override + public Map get() { + return Maps.uniqueIndex(hardware, new Function() { + @Override + public URI apply(final Hardware input) { + return input.getUri(); + } + }); + } + }; + + Supplier> imageSupplier = new Supplier>() { + @Override + public Map get() { + return Maps.uniqueIndex(images, new Function() { + @Override + public URI apply(final Image input) { + return input.getUri(); + } + }); + } + }; + + Supplier userProjectSupplier = new Supplier() { + @Override + public String get() { + return "userProject"; + } + }; + + GroupNamingConvention.Factory namingConventionFactory = + new GroupNamingConvention.Factory() { + @Override + public GroupNamingConvention createWithoutPrefix() { + return new FixedGroupNamingConvention(groupName); + } + + @Override + public GroupNamingConvention create() { + return new FixedGroupNamingConvention(groupName); + } + }; + + return new InstanceInZoneToNodeMetadata( + ImmutableMap.builder() + .put(Instance.Status.RUNNING, NodeMetadata.Status.PENDING).build(), + namingConventionFactory, + imageSupplier, + hardwareSupplier, + locationSupplier, + new FirewallTagNamingConvention.Factory(namingConventionFactory), + createMock(GoogleComputeEngineApi.class), + userProjectSupplier); + } + + @Test + public final void testTagFilteringWorks() { + InstanceInZone instanceInZone = new InstanceInZone(instance, "zoneId"); + NodeMetadata nodeMetadata = groupGroupNodeParser.apply(instanceInZone); + assertEquals(nodeMetadata.getId(), "id/test-0"); + assertEquals(nodeMetadata.getTags(), ImmutableSet.of( + "aTag" // "aTag" kept as a non firewall tag. + // "Group-port-42" filtered out as a firewall tag. + )); + } + + @Test + public final void testInstanceWithGroupNull() { + InstanceInZone instanceInZone = new InstanceInZone(instance, "zoneId"); + NodeMetadata nodeMetadata = groupNullNodeParser.apply(instanceInZone); + assertEquals(nodeMetadata.getId(), "id/test-0"); + assertEquals(nodeMetadata.getTags(), ImmutableSet.of("aTag", "Group-port-42")); + } +} -- 1.9.3 From b698e38f1c4fd7ad99c2fbf8a43c693f15c1ed83 Mon Sep 17 00:00:00 2001 From: Marek Wieczorek Date: Mon, 9 Jun 2014 16:44:03 +0200 Subject: [PATCH 2/2] Fixing other Checkstyle violations in GCE. --- .../CreateNodesWithGroupEncodedIntoNameThenAddToSet.java | 3 ++- .../jclouds/googlecomputeengine/handlers/MetadataBinder.java | 3 ++- .../compute/GoogleComputeEngineServiceExpectTest.java | 10 +++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java index d44a098..14af9cd 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java @@ -175,7 +175,8 @@ private void getOrCreateFirewalls(GoogleComputeEngineTemplateOptions templateOpt for (AtomicReference operation : operations) { retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval, MILLISECONDS).apply(operation); - checkState(!operation.get().getHttpError().isPresent(), "Could not create firewall, operation failed" + operation); + checkState(!operation.get().getHttpError().isPresent(), + "Could not create firewall, operation failed" + operation); } } diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/handlers/MetadataBinder.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/handlers/MetadataBinder.java index ddfecaa..fa2369d 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/handlers/MetadataBinder.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/handlers/MetadataBinder.java @@ -39,7 +39,8 @@ */ @Override public R bindToRequest(R request, Map postParams) { - Map items = ImmutableMap.copyOf((Map)checkNotNull(postParams.get("items"), "item")); + Map items = + ImmutableMap.copyOf((Map) checkNotNull(postParams.get("items"), "item")); String fingerprint = (String) checkNotNull(postParams.get("fingerprint"), "fingerprint"); Metadata metadata = Metadata.builder() .fingerprint(fingerprint) diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceExpectTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceExpectTest.java index 323faa7..2532f27 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceExpectTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceExpectTest.java @@ -345,11 +345,11 @@ public void testNetworksAndFirewallDeletedWhenAllGroupNodesAreTerminated() throw .addHeader("Authorization", "Bearer " + TOKEN).build(); HttpRequest deleteDiskRequest = HttpRequest.builder() - .method("DELETE") - .endpoint("https://www.googleapis" + - ".com/compute/v1/projects/myproject/zones/us-central1-a/disks/test") - .addHeader("Accept", "application/json") - .addHeader("Authorization", "Bearer " + TOKEN).build(); + .method("DELETE") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/disks/test") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); List orderedRequests = ImmutableList.builder() .add(requestForScopes(COMPUTE_READONLY_SCOPE)) -- 1.9.3