diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/DimensionDataCloudControlApi.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/DimensionDataCloudControlApi.java index 9824357c2..3be57486f 100644 --- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/DimensionDataCloudControlApi.java +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/DimensionDataCloudControlApi.java @@ -16,6 +16,8 @@ */ package org.jclouds.dimensiondata.cloudcontrol; +import com.google.common.base.Predicate; +import com.google.inject.Provides; import org.jclouds.dimensiondata.cloudcontrol.features.AccountApi; import org.jclouds.dimensiondata.cloudcontrol.features.CustomerImageApi; import org.jclouds.dimensiondata.cloudcontrol.features.InfrastructureApi; @@ -25,8 +27,20 @@ import org.jclouds.dimensiondata.cloudcontrol.features.TagApi; import org.jclouds.rest.annotations.Delegate; +import javax.inject.Named; import java.io.Closeable; +import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.CUSTOMER_IMAGE_DELETED_PREDICATE; +import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.NETWORK_DOMAIN_DELETED_PREDICATE; +import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.NETWORK_DOMAIN_NORMAL_PREDICATE; +import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.SERVER_DELETED_PREDICATE; +import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.SERVER_NORMAL_PREDICATE; +import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.SERVER_STARTED_PREDICATE; +import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.SERVER_STOPPED_PREDICATE; +import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.VLAN_DELETED_PREDICATE; +import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.VLAN_NORMAL_PREDICATE; +import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.VM_TOOLS_RUNNING_PREDICATE; + public interface DimensionDataCloudControlApi extends Closeable { @Delegate @@ -49,4 +63,45 @@ public interface DimensionDataCloudControlApi extends Closeable { @Delegate CustomerImageApi getCustomerImageApi(); + + @Provides + @Named(VLAN_DELETED_PREDICATE) + Predicate vlanDeletedPredicate(); + + @Provides + @Named(NETWORK_DOMAIN_DELETED_PREDICATE) + Predicate networkDomainDeletedPredicate(); + + @Provides + @Named(NETWORK_DOMAIN_NORMAL_PREDICATE) + Predicate networkDomainNormalPredicate(); + + @Provides + @Named(VLAN_NORMAL_PREDICATE) + Predicate vlanNormalPredicate(); + + @Provides + @Named(SERVER_STOPPED_PREDICATE) + Predicate serverStoppedPredicate(); + + @Provides + @Named(SERVER_DELETED_PREDICATE) + Predicate serverDeletedPredicate(); + + @Provides + @Named(SERVER_STARTED_PREDICATE) + Predicate serverStartedPredicate(); + + @Provides + @Named(SERVER_NORMAL_PREDICATE) + Predicate serverNormalPredicate(); + + @Provides + @Named(VM_TOOLS_RUNNING_PREDICATE) + Predicate vmToolsRunningPredicate(); + + @Provides + @Named(CUSTOMER_IMAGE_DELETED_PREDICATE) + Predicate customerImageDeletedPredicate(); + } diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerToHardware.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerToHardware.java index 74eb3677f..82652e286 100644 --- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerToHardware.java +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerToHardware.java @@ -26,7 +26,17 @@ import org.jclouds.compute.domain.VolumeBuilder; import org.jclouds.dimensiondata.cloudcontrol.domain.CPU; import org.jclouds.dimensiondata.cloudcontrol.domain.CpuSpeed; -import org.jclouds.dimensiondata.cloudcontrol.domain.Disk; +import org.jclouds.dimensiondata.cloudcontrol.domain.Floppy; +import org.jclouds.dimensiondata.cloudcontrol.domain.IdeController; +import org.jclouds.dimensiondata.cloudcontrol.domain.IdeDevice; +import org.jclouds.dimensiondata.cloudcontrol.domain.IdeDeviceOrDisk; +import org.jclouds.dimensiondata.cloudcontrol.domain.IdeDisk; +import org.jclouds.dimensiondata.cloudcontrol.domain.SataController; +import org.jclouds.dimensiondata.cloudcontrol.domain.SataDevice; +import org.jclouds.dimensiondata.cloudcontrol.domain.SataDeviceOrDisk; +import org.jclouds.dimensiondata.cloudcontrol.domain.SataDisk; +import org.jclouds.dimensiondata.cloudcontrol.domain.ScsiController; +import org.jclouds.dimensiondata.cloudcontrol.domain.ScsiDisk; import org.jclouds.dimensiondata.cloudcontrol.domain.Server; import java.util.ArrayList; @@ -42,18 +52,89 @@ public Hardware apply(final Server from) { HardwareBuilder builder = new HardwareBuilder().ids(from.id()).name(from.name()).hypervisor("vmx") .processors(buildProcessorList(from.cpu())).ram(from.memoryGb() * GB_TO_MB_MULTIPLIER); - if (from.disks() != null) { - builder.volumes(FluentIterable.from(from.disks()).transform(new Function() { - @Override - public Volume apply(final Disk disk) { - return new VolumeBuilder().id(disk.id()).device(String.valueOf(disk.scsiId())) - .size(Float.valueOf(disk.sizeGb())).type(Volume.Type.LOCAL).build(); - } - }).toSet()); - } + FluentIterable completeVolumeSet = processIdeControllers(from, + FluentIterable.from(new ArrayList())); + completeVolumeSet = processSataControllers(from, completeVolumeSet); + completeVolumeSet = processScsiControllers(from, completeVolumeSet); + completeVolumeSet = processFloppies(from, completeVolumeSet); + builder.volumes(completeVolumeSet); return builder.build(); } + private FluentIterable processIdeControllers(final Server from, FluentIterable completeVolumeSet) { + if (from.ideControllers() != null) { + completeVolumeSet = completeVolumeSet.append( + FluentIterable.from(buildIdeDiskList(from.ideControllers())).transform(new Function() { + @Override + public Volume apply(final IdeDisk disk) { + return new VolumeBuilder().id(disk.id()).device(disk.slot()).size((float) disk.sizeGb()) + .type(Volume.Type.LOCAL).build(); + } + }).toSet()); + + completeVolumeSet = completeVolumeSet.append(FluentIterable.from(buildIdeDeviceList(from.ideControllers())) + .transform(new Function() { + @Override + public Volume apply(final IdeDevice device) { + return new VolumeBuilder().id(device.id()).device(device.slot()).size((float) device.sizeGb()) + .type(Volume.Type.LOCAL).build(); + } + }).toSet()); + } + return completeVolumeSet; + } + + private FluentIterable processSataControllers(final Server from, FluentIterable completeVolumeSet) { + if (from.sataControllers() != null) { + completeVolumeSet = completeVolumeSet.append(FluentIterable.from(buildSataDiskList(from.sataControllers())) + .transform(new Function() { + @Override + public Volume apply(final SataDisk disk) { + return new VolumeBuilder().id(disk.id()).device(disk.sataId()).size((float) disk.sizeGb()) + .type(Volume.Type.LOCAL).build(); + } + }).toSet()); + + completeVolumeSet = completeVolumeSet.append(FluentIterable.from(buildSataDeviceList(from.sataControllers())) + .transform(new Function() { + @Override + public Volume apply(final SataDevice device) { + return new VolumeBuilder().id(device.id()).device(device.sataId()).size((float) device.sizeGb()) + .type(Volume.Type.LOCAL).build(); + } + }).toSet()); + } + return completeVolumeSet; + } + + private FluentIterable processScsiControllers(final Server from, FluentIterable completeVolumeSet) { + if (from.scsiControllers() != null) { + completeVolumeSet = completeVolumeSet.append(FluentIterable.from(buildScsiDiskList(from.scsiControllers())) + .transform(new Function() { + @Override + public Volume apply(final ScsiDisk disk) { + return new VolumeBuilder().id(disk.id()).device(disk.scsiId()).size((float) disk.sizeGb()) + .type(Volume.Type.LOCAL).build(); + } + }).toSet()); + } + return completeVolumeSet; + } + + private FluentIterable processFloppies(final Server from, FluentIterable completeVolumeSet) { + if (from.floppies() != null) { + completeVolumeSet = completeVolumeSet.append( + FluentIterable.from(buildFloppiesList(from.floppies())).transform(new Function() { + @Override + public Volume apply(final Floppy floppy) { + return new VolumeBuilder().id(floppy.id()).device(floppy.key() + ":" + floppy.driveNumber()) + .size((float) floppy.sizeGb()).type(Volume.Type.LOCAL).build(); + } + }).toSet()); + } + return completeVolumeSet; + } + private List buildProcessorList(final CPU cpu) { final List processorList = new ArrayList(); final double speed = CpuSpeed.fromDimensionDataSpeed(cpu.speed()).getSpeed(); @@ -62,4 +143,94 @@ private List buildProcessorList(final CPU cpu) { } return processorList; } + + private List buildIdeDiskList(final List controllers) { + final List diskList = new ArrayList(); + for (int count = 0; count < controllers.size(); count++) { + for (IdeDeviceOrDisk deviceOrDisk : controllers.get(count).deviceOrDisks()) { + if (deviceOrDisk.disk() != null) { + IdeDisk ideDisk = deviceOrDisk.disk(); + diskList.add(IdeDisk.create(ideDisk.id(), + constructUniqueVolumeIdentifier(controllers.get(count).key(), ideDisk.slot()), ideDisk.sizeGb(), + ideDisk.speed(), ideDisk.state())); + } + } + } + return diskList; + } + + private List buildIdeDeviceList(final List controllers) { + final List deviceList = new ArrayList(); + for (int count = 0; count < controllers.size(); count++) { + for (IdeDeviceOrDisk deviceOrDisk : controllers.get(count).deviceOrDisks()) { + if (deviceOrDisk.device() != null) { + IdeDevice ideDevice = deviceOrDisk.device(); + if (ideDevice.sizeGb() > 0) { + deviceList.add(IdeDevice.create(ideDevice.id(), + constructUniqueVolumeIdentifier(controllers.get(count).key(), ideDevice.slot()), + ideDevice.type(), ideDevice.sizeGb(), ideDevice.fileName(), ideDevice.state())); + } + } + } + } + return deviceList; + } + + private List buildSataDiskList(final List controllers) { + final List diskList = new ArrayList(); + for (int count = 0; count < controllers.size(); count++) { + for (SataDeviceOrDisk deviceOrDisk : controllers.get(count).deviceOrDisks()) { + if (deviceOrDisk.disk() != null) { + SataDisk sataDisk = deviceOrDisk.disk(); + diskList.add(SataDisk.create(sataDisk.id(), + constructUniqueVolumeIdentifier(controllers.get(count).key(), sataDisk.sataId()), + sataDisk.sizeGb(), sataDisk.speed(), sataDisk.state())); + } + } + } + return diskList; + } + + private List buildSataDeviceList(final List controllers) { + final List deviceList = new ArrayList(); + for (int count = 0; count < controllers.size(); count++) { + for (SataDeviceOrDisk deviceOrDisk : controllers.get(count).deviceOrDisks()) { + if (deviceOrDisk.device() != null) { + SataDevice sataDevice = deviceOrDisk.device(); + if (sataDevice.sizeGb() > 0) { + deviceList.add(SataDevice.create(sataDevice.id(), + constructUniqueVolumeIdentifier(controllers.get(count).key(), sataDevice.sataId()), + sataDevice.type(), sataDevice.sizeGb(), sataDevice.fileName(), sataDevice.state())); + } + } + } + } + return deviceList; + } + + private List buildScsiDiskList(final List controllers) { + final List diskList = new ArrayList(); + for (int count = 0; count < controllers.size(); count++) { + for (ScsiDisk scsiDisk : controllers.get(count).disks()) { + diskList.add(ScsiDisk.create(scsiDisk.id(), + constructUniqueVolumeIdentifier(controllers.get(count).key(), scsiDisk.scsiId()), scsiDisk.sizeGb(), + scsiDisk.speed(), scsiDisk.state())); + } + } + return diskList; + } + + private List buildFloppiesList(final List floppies) { + List resultList = new ArrayList<>(); + for (Floppy floppy : floppies) { + if (floppy.sizeGb() > 0) { + resultList.add(floppy); + } + } + return resultList; + } + + private String constructUniqueVolumeIdentifier(int controllerKey, String diskOrDeviceId) { + return controllerKey + ":" + diskOrDeviceId; + } } diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerWithNatRuleToNodeMetadata.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerWithNatRuleToNodeMetadata.java index 403e4e45e..80bec76b6 100644 --- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerWithNatRuleToNodeMetadata.java +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerWithNatRuleToNodeMetadata.java @@ -78,7 +78,7 @@ public NodeMetadata apply(final ServerWithExternalIp serverWithExternalIp) { builder.location(find(locations.get(), idEquals(nullToEmpty(server.datacenterId())))); builder.group(nodeNamingConvention.groupInUniqueNameOrNull(server.name())); builder.hardware(serverToHardware.apply(serverWithExternalIp.server())); - builder.imageId(server.sourceImageId()); + builder.imageId(server.source().value()); builder.operatingSystem(operatingSystemToOperatingSystem.apply(server.guest().operatingSystem())); builder.status(server.started() ? serverStateToNodeStatus.get(server.state()) : diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/FirewallRuleProtocol.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/FirewallRuleProtocol.java new file mode 100644 index 000000000..9826897b8 --- /dev/null +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/FirewallRuleProtocol.java @@ -0,0 +1,28 @@ +/* + * 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.dimensiondata.cloudcontrol.domain; + +import com.google.common.base.Enums; + +public enum FirewallRuleProtocol +{ + IP, ICMP, TCP, UDP, UNRECOGNIZED; + + public static FirewallRuleProtocol fromValue(String v) { + return Enums.getIfPresent(FirewallRuleProtocol.class, v).or(UNRECOGNIZED); + } +} diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Floppy.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Floppy.java new file mode 100644 index 000000000..c0555b09a --- /dev/null +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Floppy.java @@ -0,0 +1,66 @@ +/* + * 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.dimensiondata.cloudcontrol.domain; + +import com.google.auto.value.AutoValue; +import org.jclouds.javax.annotation.Nullable; +import org.jclouds.json.SerializedNames; + +@AutoValue +public abstract class Floppy { + + public abstract String id(); + + public abstract int driveNumber(); + + public abstract int key(); + + public abstract int sizeGb(); + + @Nullable + public abstract String fileName(); + + public abstract State state(); + + public abstract Floppy.Builder toBuilder(); + + @AutoValue.Builder + public abstract static class Builder { + public abstract Floppy.Builder id(String id); + + public abstract Floppy.Builder driveNumber(int driveNumber); + + public abstract Floppy.Builder key(int key); + + public abstract Floppy.Builder sizeGb(int sizeGb); + + public abstract Floppy.Builder fileName(String fileName); + + public abstract Floppy.Builder state(State state); + + public abstract Floppy build(); + } + + public static Floppy.Builder builder() { + return new AutoValue_Floppy.Builder(); + } + + @SerializedNames({"id", "driveNumber", "key", "sizeGb", "fileName", "state" }) + public static Floppy create(String id, int driveNumber, int key, int sizeGb, String fileName, State state) { + return builder().id(id).driveNumber(driveNumber).key(key).sizeGb(sizeGb).fileName(fileName).state(state).build(); + } +} diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/IdeController.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/IdeController.java new file mode 100644 index 000000000..b8dc542b4 --- /dev/null +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/IdeController.java @@ -0,0 +1,78 @@ +/* + * 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.dimensiondata.cloudcontrol.domain; + +import com.google.auto.value.AutoValue; +import com.google.common.collect.ImmutableList; +import org.jclouds.javax.annotation.Nullable; +import org.jclouds.json.SerializedNames; + +import java.util.List; + +@AutoValue +public abstract class IdeController { + + public abstract String id(); + + public abstract int key(); + + public abstract int channel(); + + public abstract State state(); + + public abstract String adapterType(); + + @Nullable + public abstract List deviceOrDisks(); + + @AutoValue.Builder + public abstract static class Builder { + + public abstract Builder id(String id); + + public abstract Builder key(int key); + + public abstract Builder channel(int channel); + + public abstract Builder state(State state); + + public abstract Builder adapterType(String adapterType); + + public abstract Builder deviceOrDisks(List deviceOrDisks); + + abstract IdeController autoBuild(); + + abstract List deviceOrDisks(); + + public IdeController build() { + deviceOrDisks(deviceOrDisks() != null ? ImmutableList.copyOf(deviceOrDisks()) : null); + return autoBuild(); + } + } + + public static IdeController.Builder builder() { + return new AutoValue_IdeController.Builder(); + } + + @SerializedNames({ "id", "key", "channel", "state", "adapterType", "deviceOrDisk" }) + public static IdeController create(String id, int key, int channel, State state, String adapterType, + List deviceOrDisks) { + return builder().id(id).key(key).channel(channel).state(state).adapterType(adapterType) + .deviceOrDisks(deviceOrDisks).build(); + } + +} diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/IdeDevice.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/IdeDevice.java new file mode 100644 index 000000000..d70c1d78f --- /dev/null +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/IdeDevice.java @@ -0,0 +1,67 @@ +/* + * 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.dimensiondata.cloudcontrol.domain; + +import com.google.auto.value.AutoValue; +import org.jclouds.javax.annotation.Nullable; +import org.jclouds.json.SerializedNames; + +@AutoValue +public abstract class IdeDevice { + + public abstract String id(); + + public abstract String slot(); + + public abstract String type(); + + public abstract int sizeGb(); + + @Nullable + public abstract String fileName(); + + public abstract State state(); + + public abstract IdeDevice.Builder toBuilder(); + + @AutoValue.Builder + public abstract static class Builder { + + public abstract IdeDevice.Builder id(String id); + + public abstract IdeDevice.Builder slot(String slot); + + public abstract IdeDevice.Builder type(String type); + + public abstract IdeDevice.Builder sizeGb(int sizeGb); + + public abstract IdeDevice.Builder fileName(String fileName); + + public abstract IdeDevice.Builder state(State state); + + public abstract IdeDevice build(); + } + + public static IdeDevice.Builder builder() { + return new AutoValue_IdeDevice.Builder(); + } + + @SerializedNames({ "id", "slot", "type", "sizeGb", "fileName", "state" }) + public static IdeDevice create(String id, String slot, String type, int sizeGb, String fileName, State state) { + return builder().id(id).slot(slot).type(type).sizeGb(sizeGb).fileName(fileName).state(state).build(); + } +} diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/IdeDeviceOrDisk.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/IdeDeviceOrDisk.java new file mode 100644 index 000000000..8765ee7b9 --- /dev/null +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/IdeDeviceOrDisk.java @@ -0,0 +1,58 @@ +/* + * 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.dimensiondata.cloudcontrol.domain; + +import com.google.auto.value.AutoValue; +import org.jclouds.javax.annotation.Nullable; +import org.jclouds.json.SerializedNames; + +@AutoValue +public abstract class IdeDeviceOrDisk { + + @Nullable + public abstract IdeDisk disk(); + + @Nullable + public abstract IdeDevice device(); + + @AutoValue.Builder + public abstract static class Builder { + + public abstract Builder disk(IdeDisk disk); + + public abstract Builder device(IdeDevice device); + + public abstract IdeDisk disk(); + + public abstract IdeDevice device(); + + abstract IdeDeviceOrDisk autoBuild(); + + public IdeDeviceOrDisk build() { + return autoBuild(); + } + } + + public static IdeDeviceOrDisk.Builder builder() { + return new AutoValue_IdeDeviceOrDisk.Builder(); + } + + @SerializedNames({"disk", "device" }) + public static IdeDeviceOrDisk create(IdeDisk disk, IdeDevice device) { + return builder().disk(disk).device(device).build(); + } +} diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/IdeDisk.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/IdeDisk.java new file mode 100644 index 000000000..86bc18f13 --- /dev/null +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/IdeDisk.java @@ -0,0 +1,61 @@ +/* + * 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.dimensiondata.cloudcontrol.domain; + +import com.google.auto.value.AutoValue; +import org.jclouds.json.SerializedNames; + +@AutoValue +public abstract class IdeDisk { + + public abstract String id(); + + public abstract String slot(); + + public abstract int sizeGb(); + + public abstract String speed(); + + public abstract State state(); + + public abstract IdeDisk.Builder toBuilder(); + + @AutoValue.Builder + public abstract static class Builder { + + public abstract IdeDisk.Builder id(String id); + + public abstract IdeDisk.Builder slot(String slot); + + public abstract IdeDisk.Builder sizeGb(int sizeGb); + + public abstract IdeDisk.Builder speed(String speed); + + public abstract IdeDisk.Builder state(State state); + + public abstract IdeDisk build(); + } + + public static IdeDisk.Builder builder() { + return new AutoValue_IdeDisk.Builder(); + } + + @SerializedNames({ "id", "slot", "sizeGb", "speed", "state" }) + public static IdeDisk create(String id, String slot, int sizeGb, String speed, State state) { + return builder().id(id).slot(slot).sizeGb(sizeGb).speed(speed).state(state).build(); + } +} diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/OsImage.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/OsImage.java index 7b179e513..a64c7a59d 100644 --- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/OsImage.java +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/OsImage.java @@ -18,6 +18,7 @@ import com.google.auto.value.AutoValue; import com.google.common.collect.ImmutableList; +import org.jclouds.javax.annotation.Nullable; import org.jclouds.json.SerializedNames; import java.util.Date; @@ -31,6 +32,7 @@ public abstract class OsImage extends BaseImage { type = TYPE; } + @Nullable public abstract String osImageKey(); @SerializedNames({ "id", "name", "description", "cluster", "guest", "datacenterId", "cpu", "memoryGb", "nic", "disk", diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/SataController.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/SataController.java new file mode 100644 index 000000000..442adfbbe --- /dev/null +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/SataController.java @@ -0,0 +1,78 @@ +/* + * 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.dimensiondata.cloudcontrol.domain; + +import com.google.auto.value.AutoValue; +import com.google.common.collect.ImmutableList; +import org.jclouds.javax.annotation.Nullable; +import org.jclouds.json.SerializedNames; + +import java.util.List; + +@AutoValue +public abstract class SataController { + + public abstract String id(); + + public abstract int key(); + + public abstract int busNumber(); + + public abstract State state(); + + public abstract String adapterType(); + + @Nullable + public abstract List deviceOrDisks(); + + @AutoValue.Builder + public abstract static class Builder { + + public abstract Builder id(String id); + + public abstract Builder key(int key); + + public abstract Builder busNumber(int busNumber); + + public abstract Builder state(State state); + + public abstract Builder adapterType(String adapterType); + + public abstract Builder deviceOrDisks(List deviceOrDisks); + + abstract List deviceOrDisks(); + + public abstract SataController autoBuild(); + + public SataController build() { + deviceOrDisks(deviceOrDisks() != null ? ImmutableList.copyOf(deviceOrDisks()) : null); + return autoBuild(); + } + } + + public static SataController.Builder builder() { + return new AutoValue_SataController.Builder(); + } + + @SerializedNames({ "id", "key", "busNumber", "state", "adapterType", "deviceOrDisk" }) + public static SataController create(String id, int key, int busNumber, State state, String adapterType, + List deviceOrDisks) { + return builder().id(id).key(key).busNumber(busNumber).state(state).adapterType(adapterType) + .deviceOrDisks(deviceOrDisks).build(); + } + +} diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/SataDevice.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/SataDevice.java new file mode 100644 index 000000000..3f57d445f --- /dev/null +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/SataDevice.java @@ -0,0 +1,67 @@ +/* + * 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.dimensiondata.cloudcontrol.domain; + +import com.google.auto.value.AutoValue; +import org.jclouds.javax.annotation.Nullable; +import org.jclouds.json.SerializedNames; + +@AutoValue +public abstract class SataDevice { + + public abstract String id(); + + public abstract String sataId(); + + public abstract String type(); + + public abstract int sizeGb(); + + @Nullable + public abstract String fileName(); + + public abstract State state(); + + public abstract SataDevice.Builder toBuilder(); + + @AutoValue.Builder + public abstract static class Builder { + + public abstract SataDevice.Builder id(String id); + + public abstract SataDevice.Builder sataId(String sataId); + + public abstract SataDevice.Builder type(String type); + + public abstract SataDevice.Builder sizeGb(int sizeGb); + + public abstract SataDevice.Builder fileName(String fileName); + + public abstract SataDevice.Builder state(State state); + + public abstract SataDevice build(); + } + + public static SataDevice.Builder builder() { + return new AutoValue_SataDevice.Builder(); + } + + @SerializedNames({ "id", "sataId", "type", "sizeGb", "fileName", "state" }) + public static SataDevice create(String id, String sataId, String type, int sizeGb, String fileName, State state) { + return builder().id(id).sataId(sataId).type(type).sizeGb(sizeGb).fileName(fileName).state(state).build(); + } +} diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/SataDeviceOrDisk.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/SataDeviceOrDisk.java new file mode 100644 index 000000000..b47d71b87 --- /dev/null +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/SataDeviceOrDisk.java @@ -0,0 +1,58 @@ +/* + * 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.dimensiondata.cloudcontrol.domain; + +import com.google.auto.value.AutoValue; +import org.jclouds.javax.annotation.Nullable; +import org.jclouds.json.SerializedNames; + +@AutoValue +public abstract class SataDeviceOrDisk { + + @Nullable + public abstract SataDisk disk(); + + @Nullable + public abstract SataDevice device(); + + @AutoValue.Builder + public abstract static class Builder { + + public abstract Builder disk(SataDisk disk); + + public abstract Builder device(SataDevice device); + + public abstract SataDisk disk(); + + public abstract SataDevice device(); + + abstract SataDeviceOrDisk autoBuild(); + + public SataDeviceOrDisk build() { + return autoBuild(); + } + } + + public static SataDeviceOrDisk.Builder builder() { + return new AutoValue_SataDeviceOrDisk.Builder(); + } + + @SerializedNames({"disk", "device" }) + public static SataDeviceOrDisk create(SataDisk disk, SataDevice device) { + return builder().disk(disk).device(device).build(); + } +} diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/SataDisk.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/SataDisk.java new file mode 100644 index 000000000..7f1fe46c5 --- /dev/null +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/SataDisk.java @@ -0,0 +1,61 @@ +/* + * 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.dimensiondata.cloudcontrol.domain; + +import com.google.auto.value.AutoValue; +import org.jclouds.json.SerializedNames; + +@AutoValue +public abstract class SataDisk { + + public abstract String id(); + + public abstract String sataId(); + + public abstract int sizeGb(); + + public abstract String speed(); + + public abstract State state(); + + public abstract SataDisk.Builder toBuilder(); + + @AutoValue.Builder + public abstract static class Builder { + + public abstract SataDisk.Builder id(String id); + + public abstract SataDisk.Builder sataId(String sataId); + + public abstract SataDisk.Builder sizeGb(int sizeGb); + + public abstract SataDisk.Builder speed(String speed); + + public abstract SataDisk.Builder state(State state); + + public abstract SataDisk build(); + } + + public static SataDisk.Builder builder() { + return new AutoValue_SataDisk.Builder(); + } + + @SerializedNames({ "id", "sataId", "sizeGb", "speed", "state" }) + public static SataDisk create(String id, String sataId, int sizeGb, String speed, State state) { + return builder().id(id).sataId(sataId).sizeGb(sizeGb).speed(speed).state(state).build(); + } +} diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/ScsiController.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/ScsiController.java new file mode 100644 index 000000000..b02963c63 --- /dev/null +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/ScsiController.java @@ -0,0 +1,76 @@ +/* + * 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.dimensiondata.cloudcontrol.domain; + +import com.google.auto.value.AutoValue; +import com.google.common.collect.ImmutableList; +import org.jclouds.javax.annotation.Nullable; +import org.jclouds.json.SerializedNames; + +import java.util.List; + +@AutoValue +public abstract class ScsiController { + + public abstract String id(); + + public abstract int key(); + + public abstract int busNumber(); + + public abstract State state(); + + public abstract String adapterType(); + + @Nullable + public abstract List disks(); + + @AutoValue.Builder + public abstract static class Builder { + + public abstract Builder id(String id); + + public abstract Builder key(int key); + + public abstract Builder busNumber(int busNumber); + + public abstract Builder state(State state); + + public abstract Builder adapterType(String adapterType); + + abstract ScsiController autoBuild(); + + abstract List disks(); + + public abstract Builder disks(List disks); + + public ScsiController build() { + disks(disks() != null ? ImmutableList.copyOf(disks()) : null); + return autoBuild(); + } + } + + public static ScsiController.Builder builder() { + return new AutoValue_ScsiController.Builder(); + } + + @SerializedNames({ "id", "key", "busNumber", "state", "adapterType", "disk" }) + public static ScsiController create(String id, int key, int busNumber, State state, String adapterType, + List disks) { + return builder().id(id).key(key).busNumber(busNumber).adapterType(adapterType).state(state).disks(disks).build(); + } +} diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/ScsiDisk.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/ScsiDisk.java new file mode 100644 index 000000000..a9c113bff --- /dev/null +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/ScsiDisk.java @@ -0,0 +1,62 @@ +/* + * 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.dimensiondata.cloudcontrol.domain; + +import com.google.auto.value.AutoValue; +import org.jclouds.json.SerializedNames; + +@AutoValue +public abstract class ScsiDisk { + + public abstract String id(); + + public abstract String scsiId(); + + public abstract int sizeGb(); + + public abstract String speed(); + + public abstract State state(); + + public abstract ScsiDisk.Builder toBuilder(); + + @AutoValue.Builder + public abstract static class Builder { + + public abstract ScsiDisk.Builder id(String id); + + public abstract ScsiDisk.Builder scsiId(String scsiId); + + public abstract ScsiDisk.Builder sizeGb(int sizeGb); + + public abstract ScsiDisk.Builder speed(String speed); + + public abstract ScsiDisk.Builder state(State state); + + public abstract ScsiDisk build(); + } + + @SerializedNames({ "id", "scsiId", "sizeGb", "speed", "state" }) + public static ScsiDisk create(String id, String scsiId, Integer sizeGb, String speed, State state) { + return builder().id(id).scsiId(scsiId).sizeGb(sizeGb).speed(speed).state(state).build(); + } + + public static ScsiDisk.Builder builder() { + return new AutoValue_ScsiDisk.Builder(); + } + +} diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Server.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Server.java index 4657e9439..2eaf727d8 100644 --- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Server.java +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Server.java @@ -43,9 +43,12 @@ public static Builder builder() { public abstract String datacenterId(); + @Nullable + public abstract Cluster cluster(); + public abstract State state(); - public abstract String sourceImageId(); + public abstract ServerSource source(); public abstract Date createTime(); @@ -60,10 +63,19 @@ public static Builder builder() { public abstract int memoryGb(); @Nullable - public abstract List disks(); + public abstract NetworkInfo networkInfo(); + + @Nullable + public abstract List scsiControllers(); @Nullable - public abstract NetworkInfo networkInfo(); + public abstract List sataControllers(); + + @Nullable + public abstract List ideControllers(); + + @Nullable + public abstract List floppies(); @Nullable public abstract List softwareLabels(); @@ -74,16 +86,18 @@ public static Builder builder() { @Nullable public abstract VirtualHardware virtualHardware(); - @SerializedNames({ "id", "name", "description", "datacenterId", "state", "sourceImageId", "createTime", "started", - "deployed", "guest", "cpu", "memoryGb", "disk", "networkInfo", "softwareLabel", "progress", - "virtualHardware" }) - public static Server create(String id, String name, String description, String datacenterId, State state, - String sourceImageId, Date createTime, Boolean started, Boolean deployed, Guest guest, CPU cpu, int memoryGb, - List disks, NetworkInfo networkInfo, List softwareLabels, Progress progress, + @SerializedNames({"id", "name", "description", "datacenterId", "cluster", "state", "source", "createTime", "started", + "deployed", "guest", "cpu", "memoryGb", "networkInfo", "scsiController", "sataController", "ideController", + "floppy", "softwareLabel", "progress", "virtualHardware"}) + public static Server create(String id, String name, String description, String datacenterId, Cluster cluster, State state, + ServerSource source, Date createTime, Boolean started, Boolean deployed, Guest guest, CPU cpu, int memoryGb, + NetworkInfo networkInfo, List scsiControllers, List sataControllers, + List ideControllers, List floppies, List softwareLabels, Progress progress, VirtualHardware virtualHardware) { - return builder().id(id).name(name).datacenterId(datacenterId).description(description).state(state) - .sourceImageId(sourceImageId).createTime(createTime).started(started).deployed(deployed).guest(guest) - .cpu(cpu).memoryGb(memoryGb).disks(disks).networkInfo(networkInfo).softwareLabels(softwareLabels) + return builder().id(id).name(name).description(description).datacenterId(datacenterId).cluster(cluster).state(state) + .source(source).createTime(createTime).started(started).deployed(deployed).guest(guest) + .cpu(cpu).memoryGb(memoryGb).networkInfo(networkInfo).scsiControllers(scsiControllers) + .sataControllers(sataControllers).ideControllers(ideControllers).floppies(floppies).softwareLabels(softwareLabels) .progress(progress).virtualHardware(virtualHardware).build(); } @@ -101,7 +115,7 @@ public abstract static class Builder { public abstract Builder state(State state); - public abstract Builder sourceImageId(String sourceImageId); + public abstract Builder source(ServerSource source); public abstract Builder createTime(Date createTime); @@ -115,8 +129,6 @@ public abstract static class Builder { public abstract Builder memoryGb(int memoryGb); - public abstract Builder disks(List disks); - public abstract Builder networkInfo(NetworkInfo networkInfo); public abstract Builder softwareLabels(List softwareLabels); @@ -125,15 +137,36 @@ public abstract static class Builder { public abstract Builder virtualHardware(VirtualHardware virtualHardware); - abstract Server autoBuild(); + public abstract Builder cluster(Cluster cluster); - abstract List disks(); + abstract Server autoBuild(); abstract List softwareLabels(); + abstract List scsiControllers(); + + abstract List sataControllers(); + + abstract List ideControllers(); + + abstract List floppies(); + + public abstract Builder scsiControllers(List scsiControllers); + + public abstract Builder sataControllers(List sataControllers); + + public abstract Builder ideControllers(List ideControllers); + + public abstract Builder floppies(List floppies); + public Server build() { - disks(disks() != null ? ImmutableList.copyOf(disks()) : null); + scsiControllers(scsiControllers() != null ? ImmutableList.copyOf(scsiControllers()) : null); + sataControllers(sataControllers() != null ? ImmutableList.copyOf(sataControllers()) : null); + ideControllers(ideControllers() != null ? ImmutableList.copyOf(ideControllers()) : null); + floppies(floppies() != null ? ImmutableList.copyOf(floppies()) : null); + softwareLabels(softwareLabels() != null ? ImmutableList.copyOf(softwareLabels()) : null); + return autoBuild(); } } diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/ServerSource.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/ServerSource.java new file mode 100644 index 000000000..e258955f2 --- /dev/null +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/ServerSource.java @@ -0,0 +1,56 @@ +/* + * 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.dimensiondata.cloudcontrol.domain; + +import com.google.auto.value.AutoValue; +import org.jclouds.json.SerializedNames; + +@AutoValue +public abstract class ServerSource { + + public ServerSource() { + } + + public static ServerSource.Builder builder() { + return new AutoValue_ServerSource.Builder(); + } + + public abstract String type(); + + public abstract String value(); + + public abstract Builder toBuilder(); + + @SerializedNames({ "type", "value" }) + public static ServerSource create(String type, String value) { + return builder().type(type).value(value).build(); + } + + @AutoValue.Builder + public abstract static class Builder { + + public abstract Builder type(String id); + + public abstract Builder value(String name); + + abstract ServerSource autoBuild(); + + public ServerSource build() { + return autoBuild(); + } + } +} diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/options/CreateServerOptions.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/options/CreateServerOptions.java index 33e2fa178..2acb77238 100644 --- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/options/CreateServerOptions.java +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/options/CreateServerOptions.java @@ -72,6 +72,7 @@ abstract static class ServerRequest { abstract NetworkInfo networkInfo(); + @Nullable abstract List disks(); @Nullable @@ -115,7 +116,7 @@ public R bindToRequest(R request, Map po checkNotNull(postParams.get("imageId"), "imageId parameter not present").toString(), Boolean.valueOf(checkNotNull(postParams.get("start"), "start parameter not present").toString()), (NetworkInfo) checkNotNull(postParams.get("networkInfo"), "image parameter not present"), - (List) checkNotNull(postParams.get("disk"), "disk parameter not present"), + (List) postParams.get("disk"), (String) postParams.get("administratorPassword"), description, cpu, memoryGb, primaryDns, secondaryDns, microsoftTimeZone); diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/NetworkApi.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/NetworkApi.java index f43c41b1f..d67eaf308 100644 --- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/NetworkApi.java +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/NetworkApi.java @@ -18,8 +18,6 @@ import com.google.common.base.Function; import com.google.common.base.Optional; -import com.google.common.base.Predicate; -import com.google.inject.Provides; import com.google.inject.TypeLiteral; import org.jclouds.Fallbacks; import org.jclouds.Fallbacks.NullOnNotFoundOr404; @@ -68,11 +66,6 @@ import javax.ws.rs.core.MediaType; import java.util.List; -import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.NETWORK_DOMAIN_DELETED_PREDICATE; -import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.NETWORK_DOMAIN_NORMAL_PREDICATE; -import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.VLAN_DELETED_PREDICATE; -import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.VLAN_NORMAL_PREDICATE; - /** * For examples of how to use this API please refer to https://jclouds.apache.org/guides/dimensiondata/ */ @@ -308,22 +301,6 @@ String createPortList(@PayloadParam("networkDomainId") String networkDomainId, @ @Fallback(Fallbacks.VoidOnNotFoundOr404.class) void deletePortList(@PayloadParam("id") String portListId); - @Provides - @Named(VLAN_DELETED_PREDICATE) - Predicate vlanDeletedPredicate(); - - @Provides - @Named(NETWORK_DOMAIN_DELETED_PREDICATE) - Predicate networkDomainDeletedPredicate(); - - @Provides - @Named(NETWORK_DOMAIN_NORMAL_PREDICATE) - Predicate networkDomainNormalPredicate(); - - @Provides - @Named(VLAN_NORMAL_PREDICATE) - Predicate vlanNormalPredicate(); - @Singleton final class ParseFirewallRules extends ParseJson { diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApi.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApi.java index deb78376b..db2c13abb 100644 --- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApi.java +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApi.java @@ -18,8 +18,6 @@ import com.google.common.base.Function; import com.google.common.base.Optional; -import com.google.common.base.Predicate; -import com.google.inject.Provides; import com.google.inject.TypeLiteral; import org.jclouds.Fallbacks; import org.jclouds.collect.IterableWithMarker; @@ -61,18 +59,13 @@ import javax.ws.rs.core.MediaType; import java.util.List; -import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.SERVER_DELETED_PREDICATE; -import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.SERVER_NORMAL_PREDICATE; -import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.SERVER_STARTED_PREDICATE; -import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.SERVER_STOPPED_PREDICATE; - /** * For examples of how to use this API please refer to https://jclouds.apache.org/guides/dimensiondata/ */ @RequestFilters({ BasicAuthentication.class, OrganisationIdFilter.class }) @Consumes(MediaType.APPLICATION_JSON) -@Path("/caas/{jclouds.api-version}/server") +@Path("/caas/2.7/server") public interface ServerApi { @Named("server:list") @@ -180,22 +173,6 @@ String cloneServer(@PayloadParam("id") String id, @PayloadParam("imageName") Str @MapBinder(BindToJsonPayload.class) void shutdownServer(@PayloadParam("id") String id); - @Provides - @Named(SERVER_STOPPED_PREDICATE) - Predicate serverStoppedPredicate(); - - @Provides - @Named(SERVER_DELETED_PREDICATE) - Predicate serverDeletedPredicate(); - - @Provides - @Named(SERVER_STARTED_PREDICATE) - Predicate serverStartedPredicate(); - - @Provides - @Named(SERVER_NORMAL_PREDICATE) - Predicate serverNormalPredicate(); - @Singleton final class ParseServers extends ParseJson { diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/function/ServerToServerWithExternalIpTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/function/ServerToServerWithExternalIpTest.java index 97244db5f..f53ec4c04 100644 --- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/function/ServerToServerWithExternalIpTest.java +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/function/ServerToServerWithExternalIpTest.java @@ -31,6 +31,7 @@ import org.jclouds.dimensiondata.cloudcontrol.domain.NetworkInfo; import org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem; import org.jclouds.dimensiondata.cloudcontrol.domain.Server; +import org.jclouds.dimensiondata.cloudcontrol.domain.ServerSource; import org.jclouds.dimensiondata.cloudcontrol.domain.State; import org.jclouds.dimensiondata.cloudcontrol.domain.internal.ServerWithExternalIp; import org.jclouds.dimensiondata.cloudcontrol.features.NetworkApi; @@ -78,7 +79,8 @@ public void testServerToServerWithExternalIpApplyNotNull() { server = Server.builder().id("serverId").name("serverName").datacenterId("NA1") .networkInfo(NetworkInfo.create(networkDomainId, nic, new ArrayList())).cpu(cpu).deployed(true) - .state(State.NORMAL).sourceImageId("imageId").started(false).createTime(new Date()).memoryGb(1024) + .state(State.NORMAL).source(ServerSource.builder().type("Image").value("imageId").build()).started(false) + .createTime(new Date()).memoryGb(1024) .guest(Guest.builder().osCustomization(false).operatingSystem(os).build()).build(); PagedIterable natRules = PagedIterables.onlyPage(IterableWithMarkers.from(Lists.newArrayList(natRule))); @@ -107,8 +109,9 @@ public void testServerToServerWithExternalIpApplyNull() { @Test(dependsOnMethods = "testServerToServerWithExternalIpApplyNotNull") public void testServerToServerWithExternalIpApplyNetworkInfoNull() { server = Server.builder().id("serverId").name("serverName").datacenterId("NA1").networkInfo(null).cpu(cpu) - .deployed(true).state(State.NORMAL).sourceImageId("imageId").started(false).createTime(new Date()) - .memoryGb(1024).guest(Guest.builder().osCustomization(false).operatingSystem(os).build()).build(); + .deployed(true).state(State.NORMAL).source(ServerSource.builder().type("Image").value("imageId").build()) + .started(false).createTime(new Date()).memoryGb(1024) + .guest(Guest.builder().osCustomization(false).operatingSystem(os).build()).build(); ServerWithExternalIp result = new ServerToServerWithExternalIp(dimensionDataCloudControlApi).apply(server); assertNotNull(result); @@ -124,7 +127,8 @@ public void testServerToServerWithExternalIpApplyNoMathingNatRuleFound() { server = Server.builder().id("serverId").name("serverName").datacenterId("NA1") .networkInfo(NetworkInfo.create(networkDomainId, nic, new ArrayList())).cpu(cpu).deployed(true) - .state(State.NORMAL).sourceImageId("imageId").started(false).createTime(new Date()).memoryGb(1024) + .state(State.NORMAL).source(ServerSource.builder().type("Image").value("imageId").build()).started(false) + .createTime(new Date()).memoryGb(1024) .guest(Guest.builder().osCustomization(false).operatingSystem(os).build()).build(); PagedIterable natRules = PagedIterables.onlyPage(IterableWithMarkers.from(Lists.newArrayList(natRule))); diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/CleanupServerTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/CleanupServerTest.java index b5357431a..566f0d113 100644 --- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/CleanupServerTest.java +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/CleanupServerTest.java @@ -35,6 +35,7 @@ import org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem; import org.jclouds.dimensiondata.cloudcontrol.domain.PublicIpBlock; import org.jclouds.dimensiondata.cloudcontrol.domain.Server; +import org.jclouds.dimensiondata.cloudcontrol.domain.ServerSource; import org.jclouds.dimensiondata.cloudcontrol.domain.State; import org.jclouds.dimensiondata.cloudcontrol.domain.VmTools; import org.jclouds.dimensiondata.cloudcontrol.features.NetworkApi; @@ -82,7 +83,8 @@ public void setUp() throws Exception { serverBuilder = Server.builder().id(serverId).name("jclouds server").memoryGb(10) .cpu(CPU.builder().count(1).coresPerSocket(2).speed(CpuSpeed.STANDARD.getDimensionDataSpeed()).build()) .datacenterId(datacenterId).deployed(true).started(true).description("jclouds server") - .sourceImageId("sourceImageId").createTime(new Date()).guest(Guest.builder().operatingSystem( + .source(ServerSource.builder().type("IMAGE_ID").value("sourceImageId").build()).createTime(new Date()) + .guest(Guest.builder().operatingSystem( OperatingSystem.builder().id("WIN2012DC64").displayName("WIN2012DC/64").family("WINDOWS").build()) .vmTools(VmTools.builder().versionStatus(VmTools.VersionStatus.CURRENT) .runningStatus(VmTools.RunningStatus.NOT_RUNNING).apiVersion(9354) diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerToHardwareTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerToHardwareTest.java index c5d04261a..d62fa23b0 100644 --- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerToHardwareTest.java +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerToHardwareTest.java @@ -22,17 +22,29 @@ import org.jclouds.compute.domain.Volume; import org.jclouds.dimensiondata.cloudcontrol.domain.CPU; import org.jclouds.dimensiondata.cloudcontrol.domain.CpuSpeed; -import org.jclouds.dimensiondata.cloudcontrol.domain.Disk; +import org.jclouds.dimensiondata.cloudcontrol.domain.Floppy; import org.jclouds.dimensiondata.cloudcontrol.domain.Guest; +import org.jclouds.dimensiondata.cloudcontrol.domain.IdeController; +import org.jclouds.dimensiondata.cloudcontrol.domain.IdeDevice; +import org.jclouds.dimensiondata.cloudcontrol.domain.IdeDeviceOrDisk; +import org.jclouds.dimensiondata.cloudcontrol.domain.IdeDisk; import org.jclouds.dimensiondata.cloudcontrol.domain.NIC; import org.jclouds.dimensiondata.cloudcontrol.domain.NetworkInfo; import org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem; +import org.jclouds.dimensiondata.cloudcontrol.domain.SataController; +import org.jclouds.dimensiondata.cloudcontrol.domain.SataDevice; +import org.jclouds.dimensiondata.cloudcontrol.domain.SataDeviceOrDisk; +import org.jclouds.dimensiondata.cloudcontrol.domain.SataDisk; +import org.jclouds.dimensiondata.cloudcontrol.domain.ScsiController; +import org.jclouds.dimensiondata.cloudcontrol.domain.ScsiDisk; import org.jclouds.dimensiondata.cloudcontrol.domain.Server; +import org.jclouds.dimensiondata.cloudcontrol.domain.ServerSource; import org.jclouds.dimensiondata.cloudcontrol.domain.State; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import javax.xml.bind.DatatypeConverter; +import java.util.List; import static org.testng.AssertJUnit.assertEquals; @@ -47,7 +59,28 @@ public void setUp() throws Exception { } @Test - public void testApplyServer() throws Exception { + public void testApplyServer() { + + List ideDisksOrDevices = Lists.newArrayList(); + ideDisksOrDevices.add(IdeDeviceOrDisk.builder() + .disk(IdeDisk.builder().id("98299851-37a3-4ebe-9cf1-090da9ae42a0").slot("0").sizeGb(10).speed("ECONOMY") + .state(State.NORMAL).build()).build()); + ideDisksOrDevices.add(IdeDeviceOrDisk.builder().device( + IdeDevice.builder().id("98299852-37a3-4ebe-9cf1-090da9ae42a1").slot("1").sizeGb(1).fileName("WIN8DE") + .state(State.NORMAL).type("DVD").build()).build()); + + List sataDisksOrDevices = Lists.newArrayList(); + sataDisksOrDevices.add(SataDeviceOrDisk.builder().disk( + SataDisk.builder().id("98299853-37a3-4ebe-9cf1-090da9ae42a2").sataId("0").sizeGb(20).speed("STANDARD").state(State.NORMAL) + .build()).build()); + sataDisksOrDevices.add(SataDeviceOrDisk.builder().device( + SataDevice.builder().id("98299854-37a3-4ebe-9cf1-090da9ae42a3").sataId("1").sizeGb(1).fileName("WIN10CE").state(State.NORMAL) + .type("DVD").build()).build()); + + List scsiDisks = Lists.newArrayList( + ScsiDisk.builder().id("98299855-37a3-4ebe-9cf1-090da9ae42a4").scsiId("0").sizeGb(30) + .speed("HIGHPERFORMANCE").state(State.NORMAL).build()); + final Server server = Server.builder().id("12ea8472-6e4e-4068-b2cb-f04ecacd3962").name("CentOS 5 64-bit") .description("DRaaS CentOS Release 5.9 64-bit").guest(Guest.builder().osCustomization(false) .operatingSystem( @@ -56,12 +89,22 @@ public void testApplyServer() throws Exception { .networkInfo(NetworkInfo.builder().primaryNic( NIC.builder().id("def96a04-d1ee-48b9-b07d-3993594724d2").privateIpv4("192.168.1.2") .vlanId("19737c24-259a-49e2-a5b7-a8a042a96108").build()) - .additionalNic(Lists.newArrayList()).networkDomainId("testNetworkDomain").build()).disks(ImmutableList - .of(Disk.builder().id("98299851-37a3-4ebe-9cf1-090da9ae42a0").scsiId(0).sizeGb(20).speed("STANDARD") - .build())).softwareLabels(Lists.newArrayList()) + .additionalNic(Lists.newArrayList()).networkDomainId("testNetworkDomain").build()) + .ideControllers(ImmutableList.of(IdeController.builder().id("def96a00-d1ee-48b9-b07d-3993594724d0") + .adapterType("IDE_CONTROLLER_XXX").channel(0).key(3001).deviceOrDisks(ideDisksOrDevices) + .state(State.NORMAL).build())).sataControllers(ImmutableList + .of(SataController.builder().id("def96a01-d1ee-48b9-b07d-3993594724d1").adapterType("AHCI_CONTROLLER") + .busNumber(0).key(15000).deviceOrDisks(sataDisksOrDevices).state(State.NORMAL).build())) + .scsiControllers(ImmutableList + .of(ScsiController.builder().id("def96a02-d1ee-48b9-b07d-3993594724d2").adapterType("BUS_LOGIC") + .busNumber(0).key(1000).disks(scsiDisks).state(State.NORMAL).build())).floppies(ImmutableList + .of(Floppy.builder().id("def96a03-d1ee-48b9-b07d-3993594724d3").driveNumber(0).key(8000) + .fileName("floppy.flp").sizeGb(1).state(State.NORMAL).build())) + .softwareLabels(Lists.newArrayList()) .createTime(DatatypeConverter.parseDateTime("2016-06-09T17:36:31.000Z").getTime()).datacenterId("EU6") - .state(State.NORMAL).sourceImageId("1806fe4a-0400-46ad-a6ab-1fe3c9ebc947").started(false).deployed(true) - .build(); + .state(State.NORMAL) + .source(ServerSource.builder().type("IMAGE_ID").value("1806fe4a-0400-46ad-a6ab-1fe3c9ebc947").build()) + .started(false).deployed(true).build(); applyAndAssert(server); } @@ -72,13 +115,15 @@ private void applyAndAssert(Server server) { assertEquals(server.id(), hardware.getId()); assertEquals(server.id(), hardware.getProviderId()); assertEquals(server.name(), hardware.getName()); - assertEquals(server.disks().size(), hardware.getVolumes().size()); - assertEquals(Float.valueOf(server.disks().get(0).sizeGb()), hardware.getVolumes().get(0).getSize()); + + assertEquals(6, hardware.getVolumes().size()); + assertEquals(10F, hardware.getVolumes().get(0).getSize()); assertEquals(Volume.Type.LOCAL, hardware.getVolumes().get(0).getType()); - assertEquals(server.disks().get(0).id(), hardware.getVolumes().get(0).getId()); - assertEquals(server.disks().get(0).scsiId().toString(), hardware.getVolumes().get(0).getDevice()); + assertEquals("98299851-37a3-4ebe-9cf1-090da9ae42a0", hardware.getVolumes().get(0).getId()); + assertEquals("3001:0", hardware.getVolumes().get(0).getDevice()); + assertEquals("8000:0", hardware.getVolumes().get(5).getDevice()); assertEquals(server.cpu().count(), hardware.getProcessors().size()); - assertEquals(Double.valueOf(server.cpu().coresPerSocket()), hardware.getProcessors().get(0).getCores()); + assertEquals((double) server.cpu().coresPerSocket(), hardware.getProcessors().get(0).getCores()); assertEquals(CpuSpeed.STANDARD.getSpeed(), hardware.getProcessors().get(0).getSpeed()); } diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerWithNatRuleToNodeMetadataTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerWithNatRuleToNodeMetadataTest.java index 5f83775ff..3dab8f04d 100644 --- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerWithNatRuleToNodeMetadataTest.java +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerWithNatRuleToNodeMetadataTest.java @@ -31,6 +31,7 @@ import org.jclouds.dimensiondata.cloudcontrol.domain.NetworkInfo; import org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem; import org.jclouds.dimensiondata.cloudcontrol.domain.Server; +import org.jclouds.dimensiondata.cloudcontrol.domain.ServerSource; import org.jclouds.dimensiondata.cloudcontrol.domain.State; import org.jclouds.dimensiondata.cloudcontrol.domain.internal.ServerWithExternalIp; import org.jclouds.dimensiondata.cloudcontrol.features.ServerImageApi; @@ -106,7 +107,7 @@ public Set get() { server = Server.builder().id("serverId").name(serverName).datacenterId(datacenterId) .networkInfo(NetworkInfo.create(networkDomainId, nic, new ArrayList())).cpu(cpu).deployed(true) - .state(State.NORMAL).sourceImageId("imageId").started(true).createTime(new Date()).memoryGb(1024) + .state(State.NORMAL).source(ServerSource.builder().type("IMAGE_ID").value("imageId").build()).started(true).createTime(new Date()).memoryGb(1024) .guest(Guest.builder().osCustomization(false).operatingSystem(os).build()).build(); serverWithNatRuleToNodeMetadata = new ServerWithNatRuleToNodeMetadata(locations, conventionFactory, @@ -131,7 +132,7 @@ public void testApply() { EasyMock.replay(nodeNamingConvention, serverImageApi, image, nic, serverToHardware, operatingSystemToOperatingSystem); assertNodeMetadata(serverWithNatRuleToNodeMetadata.apply(serverWithExternalIp), operatingSystem, - serverWithExternalIp.server().sourceImageId(), NodeMetadata.Status.RUNNING, + serverWithExternalIp.server().source().value(), NodeMetadata.Status.RUNNING, ImmutableSet.of(nic.privateIpv4()), ImmutableSet.of(externalIp)); } @@ -140,7 +141,7 @@ public void testApplyWithNullables() { server = Server.builder().id("serverId").name(serverName).datacenterId(datacenterId) .networkInfo(NetworkInfo.create(networkDomainId, nic, new ArrayList())).cpu(cpu).deployed(true) - .state(State.DELETED).sourceImageId("imageId").started(true).createTime(new Date()).memoryGb(1024) + .state(State.DELETED).source(ServerSource.builder().type("IMAGE_ID").value("imageId").build()).started(true).createTime(new Date()).memoryGb(1024) .guest(Guest.builder().osCustomization(false).operatingSystem(os).build()).build(); serverWithExternalIp = ServerWithExternalIp.create(server, null); @@ -160,7 +161,7 @@ public void testApplyServerStopped() { server = Server.builder().id("serverId").name(serverName).datacenterId(datacenterId) .networkInfo(NetworkInfo.create(networkDomainId, nic, new ArrayList())).cpu(cpu).deployed(true) - .state(State.DELETED).sourceImageId("imageId").started(false).createTime(new Date()).memoryGb(1024) + .state(State.DELETED).source(ServerSource.builder().type("IMAGE_ID").value("imageId").build()).started(false).createTime(new Date()).memoryGb(1024) .guest(Guest.builder().osCustomization(false).operatingSystem(os).build()).build(); serverWithExternalIp = ServerWithExternalIp.create(server, externalIp); @@ -178,7 +179,7 @@ public void testApplyServerStopped() { EasyMock.replay(nodeNamingConvention, serverImageApi, image, nic, serverToHardware, operatingSystemToOperatingSystem); assertNodeMetadata(serverWithNatRuleToNodeMetadata.apply(serverWithExternalIp), operatingSystem, - serverWithExternalIp.server().sourceImageId(), NodeMetadata.Status.SUSPENDED, + serverWithExternalIp.server().source().value(), NodeMetadata.Status.SUSPENDED, ImmutableSet.of(nic.privateIpv4()), ImmutableSet.of(externalIp)); } diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/NetworkApiLiveTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/NetworkApiLiveTest.java index 6cfdafec0..5762a74c8 100644 --- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/NetworkApiLiveTest.java +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/NetworkApiLiveTest.java @@ -20,6 +20,7 @@ import com.google.common.collect.Lists; import org.jclouds.collect.PagedIterable; import org.jclouds.dimensiondata.cloudcontrol.domain.FirewallRule; +import org.jclouds.dimensiondata.cloudcontrol.domain.FirewallRuleProtocol; import org.jclouds.dimensiondata.cloudcontrol.domain.FirewallRuleTarget; import org.jclouds.dimensiondata.cloudcontrol.domain.IpRange; import org.jclouds.dimensiondata.cloudcontrol.domain.Placement; @@ -32,6 +33,8 @@ import java.util.Date; import java.util.List; +import static org.jclouds.dimensiondata.cloudcontrol.compute.options.DimensionDataCloudControlTemplateOptions.DEFAULT_PRIVATE_IPV4_BASE_ADDRESS; +import static org.jclouds.dimensiondata.cloudcontrol.compute.options.DimensionDataCloudControlTemplateOptions.DEFAULT_PRIVATE_IPV4_PREFIX_SIZE; import static org.jclouds.dimensiondata.cloudcontrol.features.NetworkApiMockTest.DEFAULT_ACTION; import static org.jclouds.dimensiondata.cloudcontrol.features.NetworkApiMockTest.DEFAULT_IP_VERSION; import static org.jclouds.dimensiondata.cloudcontrol.utils.DimensionDataCloudControlResponseUtils.generateFirewallRuleName; @@ -75,7 +78,7 @@ public void testGetPortList() { @Test(dependsOnMethods = "testGetPortList") public void testCreateFirewallRuleWithPortList() { firewallRuleId = api().createFirewallRule(networkDomainId, generateFirewallRuleName("server-id"), DEFAULT_ACTION, - DEFAULT_IP_VERSION, DEFAULT_PROTOCOL, FirewallRuleTarget.builder().ip(IpRange.create("ANY", null)).build(), + DEFAULT_IP_VERSION, FirewallRuleProtocol.TCP.name(), FirewallRuleTarget.builder().ip(IpRange.create("ANY", null)).build(), FirewallRuleTarget.builder().ip(IpRange.create("ANY", null)).portListId(portListId).build(), Boolean.TRUE, Placement.builder().position("LAST").build()); firewallRuleIds.add(firewallRuleId); @@ -101,7 +104,7 @@ public void testDeployVlan() { NetworkApiLiveTest.class.getSimpleName() + new Date().getTime(), DEFAULT_PRIVATE_IPV4_BASE_ADDRESS, DEFAULT_PRIVATE_IPV4_PREFIX_SIZE); assertNotNull(vlanId); - assertTrue(vlanNormalPredicate.apply(vlanId), "vlan is not in a NORMAL state after timeout"); + assertTrue(api.vlanNormalPredicate().apply(vlanId), "vlan is not in a NORMAL state after timeout"); } @Test @@ -110,7 +113,7 @@ public void testDeployNetworkDomain() { networkDomainId = api().deployNetworkDomain(datacenters.iterator().next(), networkDomainName, NetworkApiLiveTest.class.getSimpleName() + new Date().getTime() + "description", "ESSENTIALS"); assertNotNull(networkDomainId); - assertTrue(networkDomainNormalPredicate.apply(networkDomainId), + assertTrue(api.networkDomainNormalPredicate().apply(networkDomainId), "network domain is not in a NORMAL state after timeout"); } @@ -131,11 +134,11 @@ public void tearDown() { } if (vlanId != null) { api().deleteVlan(vlanId); - assertTrue(vlanDeletedPredicate.apply(vlanId), "vlan is not in a DELETED state after timeout"); + assertTrue(api.vlanDeletedPredicate().apply(vlanId), "vlan is not in a DELETED state after timeout"); } if (networkDomainId != null) { api().deleteNetworkDomain(networkDomainId); - assertTrue(networkDomainDeletedPredicate.apply(networkDomainId), + assertTrue(api.networkDomainDeletedPredicate().apply(networkDomainId), "network domain is not in a DELETED state after timeout"); } } diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/NetworkApiMockTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/NetworkApiMockTest.java index ba94b0fe7..f623813d7 100644 --- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/NetworkApiMockTest.java +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/NetworkApiMockTest.java @@ -20,6 +20,7 @@ import com.squareup.okhttp.mockwebserver.MockResponse; import com.squareup.okhttp.mockwebserver.RecordedRequest; import org.jclouds.dimensiondata.cloudcontrol.domain.FirewallRule; +import org.jclouds.dimensiondata.cloudcontrol.domain.FirewallRuleProtocol; import org.jclouds.dimensiondata.cloudcontrol.domain.FirewallRuleTarget; import org.jclouds.dimensiondata.cloudcontrol.domain.IpRange; import org.jclouds.dimensiondata.cloudcontrol.domain.NatRule; @@ -36,7 +37,6 @@ import javax.ws.rs.HttpMethod; import java.util.List; -import static ch.qos.logback.core.net.ssl.SSL.DEFAULT_PROTOCOL; import static com.google.common.collect.Iterables.size; import static javax.ws.rs.HttpMethod.GET; import static javax.ws.rs.HttpMethod.POST; @@ -193,7 +193,7 @@ public void testCreateFirewallRule() throws Exception { + "} ],\n" + "\"warning\": [],\n" + "\"error\": [],\n" + "\"requestId\": \"NA9/2015-03-05T13:46:34.848-05:00/f8fdef24-8a12-45ea-a831-\n" + "d5463212ef6a\" }")); - api().createFirewallRule("123456", "test", DEFAULT_ACTION, DEFAULT_IP_VERSION, DEFAULT_PROTOCOL, + api().createFirewallRule("123456", "test", DEFAULT_ACTION, DEFAULT_IP_VERSION, FirewallRuleProtocol.TCP.name(), FirewallRuleTarget.builder().ip(IpRange.create("ANY", null)).build(), FirewallRuleTarget.builder().ip(IpRange.create("ANY", null)).build(), true, Placement.builder().position("LAST").build()); diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApiLiveTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApiLiveTest.java index 9fd3e91f5..99311f69b 100644 --- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApiLiveTest.java +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApiLiveTest.java @@ -59,6 +59,7 @@ public class ServerApiLiveTest extends BaseDimensionDataCloudControlApiLiveTest private String vlanId; private String networkDomainId; private String imageId; + private String imageDiskId; private String tagKeyId; private String publicIpv4BlockId; private PublicIpBlock publicIpBlock; @@ -91,7 +92,7 @@ public void testDeployAndStartServer() { Boolean started = Boolean.TRUE; NetworkInfo networkInfo = NetworkInfo .create(networkDomainId, NIC.builder().vlanId(vlanId).build(), Lists.newArrayList()); - List disks = ImmutableList.of(Disk.builder().scsiId(0).speed("STANDARD").build()); + List disks = ImmutableList.of(Disk.builder().scsiId(0).speed("STANDARD").id(imageDiskId).build()); serverId = api.getServerApi() .deployServer(deployedServerName, imageId, started, networkInfo, "P$$ssWwrrdGoDd!", disks, null); assertNotNull(serverId); @@ -279,6 +280,7 @@ private void findOsImage(final String datacenterId) { .listOsImages(DatacenterIdListFilters.Builder.datacenterId(datacenterId)).first(); assertTrue(osImageOptional.isPresent(), "unable to find compatible image for datacenter"); imageId = osImageOptional.get().id(); + imageDiskId = osImageOptional.get().disks().get(0).id(); } private void deployVlan() { diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApiMockTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApiMockTest.java index 553be1dbb..6e3ac3d50 100644 --- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApiMockTest.java +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApiMockTest.java @@ -58,7 +58,7 @@ public void testDeployServerReturnsUnexpectedError() throws InterruptedException failBecauseExceptionWasNotThrown(HttpResponseException.class); } catch (HttpResponseException e) { assertNotNull(e); - assertSent(POST, "/caas/2.4/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/deployServer"); + assertSent(POST, "/caas/2.7/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/deployServer"); } } @@ -75,7 +75,7 @@ public void testDeployServerWithSpecificCpu() throws InterruptedException { "administratorPassword", Lists.newArrayList(), createServerOptions); assertEquals(serverId, "7b62aae5-bdbe-4595-b58d-c78f95db2a7f"); RecordedRequest recordedRequest = assertSent(POST, - "/caas/2.4/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/deployServer"); + "/caas/2.7/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/deployServer"); assertBodyContains(recordedRequest, "\"cpu\":{\"count\":1,\"speed\":\"HIGHPERFORMANCE\",\"coresPerSocket\":2}"); } @@ -88,7 +88,7 @@ public void testClone() throws Exception { assertEquals(imageId, "3389ffe8-c3fc-11e3-b29c-001517c4643e"); RecordedRequest recordedRequest = assertSent(POST, - "/caas/2.4/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/cloneServer"); + "/caas/2.7/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/cloneServer"); assertBodyContains(recordedRequest, "{\"id\":\"9ed47330-5561-11e5-8c14-b8ca3a5d9ef8\",\"imageName\":\"serverNewImageName\"," @@ -118,7 +118,7 @@ public void testListServersWithDatacenterFiltering() throws Exception { } private Uris.UriBuilder getListServerUriBuilder() { - return Uris.uriBuilder("/caas/2.4/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/server"); + return Uris.uriBuilder("/caas/2.7/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/server"); } public void testListServers_NoServersFound() { @@ -129,7 +129,7 @@ public void testListServers_NoServersFound() { public void testGetServer() throws Exception { server.enqueue(jsonResponse("/server.json")); Server found = serverApi().getServer("12345"); - assertSent(GET, "/caas/2.4/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/server/12345"); + assertSent(GET, "/caas/2.7/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/server/12345"); assertNotNull(found); assertNotNull(found.guest().vmTools()); } @@ -144,7 +144,7 @@ public void testDeleteServer() throws Exception { server.enqueue(jsonResponse("/deleteServer.json")); serverApi().deleteServer("12345"); final RecordedRequest recordedRequest = assertSent(POST, - "/caas/2.4/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/deleteServer"); + "/caas/2.7/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/deleteServer"); assertBodyContains(recordedRequest, "{\"id\":\"12345\"}"); } @@ -157,7 +157,7 @@ public void testPowerOffServer() throws Exception { server.enqueue(jsonResponse("/powerOffServer.json")); serverApi().powerOffServer("12345"); final RecordedRequest recordedRequest = assertSent(POST, - "/caas/2.4/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/powerOffServer"); + "/caas/2.7/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/powerOffServer"); assertBodyContains(recordedRequest, "{\"id\":\"12345\"}"); } @@ -165,7 +165,7 @@ public void testRebootServer() throws Exception { server.enqueue(jsonResponse("/rebootServer.json")); serverApi().rebootServer("12345"); final RecordedRequest recordedRequest = assertSent(POST, - "/caas/2.4/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/rebootServer"); + "/caas/2.7/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/rebootServer"); assertBodyContains(recordedRequest, "{\"id\":\"12345\"}"); } @@ -173,7 +173,7 @@ public void testReconfigureServer() throws Exception { server.enqueue(jsonResponse("/reconfigureServer.json")); serverApi().reconfigureServer("12345", 2, "STANDARD", 2); final RecordedRequest recordedRequest = assertSent(POST, - "/caas/2.4/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/reconfigureServer"); + "/caas/2.7/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/reconfigureServer"); assertBodyContains(recordedRequest, "{\"id\":\"12345\",\"cpuCount\":2,\"cpuSpeed\":\"STANDARD\",\"coresPerSocket\":2}"); } @@ -182,7 +182,7 @@ public void testShutdownServer() throws Exception { server.enqueue(jsonResponse("/rebootServer.json")); serverApi().shutdownServer("12345"); final RecordedRequest recordedRequest = assertSent(POST, - "/caas/2.4/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/shutdownServer"); + "/caas/2.7/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/shutdownServer"); assertBodyContains(recordedRequest, "{\"id\":\"12345\"}"); } @@ -190,7 +190,7 @@ public void testStartServer() throws Exception { server.enqueue(jsonResponse("/rebootServer.json")); serverApi().startServer("12345"); final RecordedRequest recordedRequest = assertSent(POST, - "/caas/2.4/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/startServer"); + "/caas/2.7/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/startServer"); assertBodyContains(recordedRequest, "{\"id\":\"12345\"}"); } @@ -198,7 +198,7 @@ public void testCleanServer() throws Exception { server.enqueue(jsonResponse("/cleanServer.json")); serverApi().cleanServer("12345"); final RecordedRequest recordedRequest = assertSent(POST, - "/caas/2.4/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/cleanServer"); + "/caas/2.7/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/cleanServer"); assertBodyContains(recordedRequest, "{\"id\":\"12345\"}"); } diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/ServerParseTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/ServerParseTest.java index 41486df3b..c5907d3df 100644 --- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/ServerParseTest.java +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/ServerParseTest.java @@ -16,13 +16,27 @@ */ package org.jclouds.dimensiondata.cloudcontrol.parse; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import org.jclouds.dimensiondata.cloudcontrol.domain.CPU; -import org.jclouds.dimensiondata.cloudcontrol.domain.Disk; +import org.jclouds.dimensiondata.cloudcontrol.domain.Cluster; +import org.jclouds.dimensiondata.cloudcontrol.domain.Floppy; import org.jclouds.dimensiondata.cloudcontrol.domain.Guest; +import org.jclouds.dimensiondata.cloudcontrol.domain.IdeController; +import org.jclouds.dimensiondata.cloudcontrol.domain.IdeDevice; +import org.jclouds.dimensiondata.cloudcontrol.domain.IdeDeviceOrDisk; +import org.jclouds.dimensiondata.cloudcontrol.domain.IdeDisk; import org.jclouds.dimensiondata.cloudcontrol.domain.NIC; import org.jclouds.dimensiondata.cloudcontrol.domain.NetworkInfo; import org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem; +import org.jclouds.dimensiondata.cloudcontrol.domain.SataController; +import org.jclouds.dimensiondata.cloudcontrol.domain.SataDevice; +import org.jclouds.dimensiondata.cloudcontrol.domain.SataDeviceOrDisk; +import org.jclouds.dimensiondata.cloudcontrol.domain.SataDisk; +import org.jclouds.dimensiondata.cloudcontrol.domain.ScsiController; +import org.jclouds.dimensiondata.cloudcontrol.domain.ScsiDisk; import org.jclouds.dimensiondata.cloudcontrol.domain.Server; +import org.jclouds.dimensiondata.cloudcontrol.domain.ServerSource; import org.jclouds.dimensiondata.cloudcontrol.domain.State; import org.jclouds.dimensiondata.cloudcontrol.domain.VirtualHardware; import org.jclouds.dimensiondata.cloudcontrol.domain.VmTools; @@ -31,7 +45,9 @@ import javax.ws.rs.Consumes; import javax.ws.rs.core.MediaType; +import java.util.ArrayList; import java.util.Collections; +import java.util.List; @Test(groups = "unit") public class ServerParseTest extends BaseDimensionDataCloudControlParseTest { @@ -45,23 +61,54 @@ public String resource() { @Consumes(MediaType.APPLICATION_JSON) public Server expected() { - return Server.builder().id("cb08c7ba-7a51-4e32-8d39-05d2270f8f8b").name("ServerApiLiveTest").datacenterId("EU6") - .state(State.NORMAL).sourceImageId("56eb0b7c-15a7-4b63-b373-05b962e37554") - .createTime(parseDate("2017-07-03T16:29:33.000Z")).started(true).deployed(true).guest(Guest.builder() + List ideDisksOrDevices = new ArrayList<>(); + ideDisksOrDevices.add(IdeDeviceOrDisk.builder().device( + IdeDevice.builder().id("fd70be3c-f068-4bbf-a55c-8c776a66ed5a").slot("0").sizeGb(1).fileName("WIN8DE") + .state(State.NORMAL).type("DVD").build()).build()); + ideDisksOrDevices.add(IdeDeviceOrDisk.builder() + .disk(IdeDisk.builder().id("98299851-37a3-4ebe-9cf1-090da9ae42a0").slot("1").sizeGb(10).speed("ECONOMY") + .state(State.NORMAL).build()).build()); + + List sataDisksOrDevices = Lists.newArrayList(); + sataDisksOrDevices.add(SataDeviceOrDisk.builder() + .disk(SataDisk.builder().id("98299853-37a3-4ebe-9cf1-090da9ae42a2").sataId("0").sizeGb(20).speed("STANDARD") + .state(State.NORMAL).build()).build()); + sataDisksOrDevices.add(SataDeviceOrDisk.builder().device( + SataDevice.builder().id("98299854-37a3-4ebe-9cf1-090da9ae42a3").sataId("1").sizeGb(1).fileName("WIN10CE") + .state(State.NORMAL).type("DVD").build()).build()); + + List scsiDisks = Lists.newArrayList( + ScsiDisk.builder().id("98299855-37a3-4ebe-9cf1-090da9ae42a4").scsiId("0").sizeGb(30) + .speed("HIGHPERFORMANCE").state(State.NORMAL).build()); + + return Server.builder().id("b8246ba4-847d-475b-b296-f76787a69ca8").name("parser-test-server-name") + .description("parser-test-server-description").datacenterId("NA9").state(State.NORMAL) + .cluster(Cluster.builder().id("NA9-01").name("SAP Cluster").build()) + .source(ServerSource.builder().type("IMAGE_ID").value("1e44ab3f-2426-45ec-a1b5-827b2ce58836").build()) + .createTime(parseDate("2016-03-10T13:05:21.000Z")).started(true).deployed(true).guest(Guest.builder() .operatingSystem( - OperatingSystem.builder().id("REDHAT764").displayName("REDHAT7/64").family("UNIX").build()) - .vmTools(VmTools.builder().apiVersion(9356).type(VmTools.Type.VMWARE_TOOLS) - .versionStatus(VmTools.VersionStatus.CURRENT).runningStatus(VmTools.RunningStatus.NOT_RUNNING) + OperatingSystem.builder().id("CENTOS564").displayName("CENTOS5/64").family("UNIX").build()) + .vmTools(VmTools.builder().apiVersion(9354).type(VmTools.Type.VMWARE_TOOLS) + .versionStatus(VmTools.VersionStatus.NEED_UPGRADE).runningStatus(VmTools.RunningStatus.RUNNING) .build()).osCustomization(true).build()) - .cpu(CPU.builder().count(2).speed("STANDARD").coresPerSocket(1).build()).memoryGb(4).disks(Collections - .singletonList( - Disk.builder().id("918f12ba-5e5e-4cd6-87bd-60c18293c24d").scsiId(0).sizeGb(20).speed("STANDARD") - .state(State.NORMAL).build())).networkInfo(NetworkInfo.builder().primaryNic( - NIC.builder().id("f0c00cab-bfa3-4c51-8c0a-c52fdac1ae4b").privateIpv4("10.0.0.7") + .cpu(CPU.builder().count(2).speed("STANDARD").coresPerSocket(1).build()).memoryGb(4).ideControllers( + ImmutableList.of(IdeController.builder().id("5bdfc88c-5509-420c-8c5d-cc7876dacfbe") + .adapterType("IDE_CONTROLLER_XXX").channel(0).key(3000).state(State.NORMAL).build(), + IdeController.builder().id("def96a00-d1ee-48b9-b07d-3993594724d0") + .adapterType("IDE_CONTROLLER_XXX").channel(1).key(3001).deviceOrDisks(ideDisksOrDevices) + .state(State.NORMAL).build())).sataControllers(ImmutableList + .of(SataController.builder().id("def96a01-d1ee-48b9-b07d-3993594724d1").adapterType("AHCI_CONTROLLER") + .busNumber(0).key(15000).deviceOrDisks(sataDisksOrDevices).state(State.NORMAL).build())) + .scsiControllers(ImmutableList + .of(ScsiController.builder().id("def96a02-d1ee-48b9-b07d-3993594724d2").adapterType("BUS_LOGIC") + .busNumber(0).key(1000).disks(scsiDisks).state(State.NORMAL).build())).floppies(ImmutableList + .of(Floppy.builder().id("afeafa7e-742d-4902-a3f8-67d9bec5c160").driveNumber(0).key(8000).sizeGb(0) + .state(State.NORMAL).build())).networkInfo(NetworkInfo.builder().primaryNic( + NIC.builder().id("980a9fdd-4ea2-478b-85b4-f016349f1738").privateIpv4("10.0.0.8") .ipv6("2a00:47c0:111:1131:5851:1950:411c:3dd8").vlanId("7bd12a4d-4e83-4254-a266-174aa5f55187") - .vlanName("jclouds vlan").state(State.NORMAL).build()).additionalNic(Collections.emptyList()) + .vlanName("jclouds vlan").state(State.NORMAL).build()).additionalNic(null) .networkDomainId("d122949b-8990-46d6-98f0-91c8676fc720").build()) - .virtualHardware(VirtualHardware.builder().upToDate(true).version("vmx-10").build()) + .virtualHardware(VirtualHardware.builder().upToDate(false).version("vmx-08").build()) .softwareLabels(Collections.emptyList()).build(); } } diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/ServersParseTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/ServersParseTest.java index d67c64ab3..cc74c2a95 100644 --- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/ServersParseTest.java +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/ServersParseTest.java @@ -17,13 +17,26 @@ package org.jclouds.dimensiondata.cloudcontrol.parse; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import org.jclouds.dimensiondata.cloudcontrol.domain.CPU; -import org.jclouds.dimensiondata.cloudcontrol.domain.Disk; +import org.jclouds.dimensiondata.cloudcontrol.domain.Cluster; +import org.jclouds.dimensiondata.cloudcontrol.domain.Floppy; import org.jclouds.dimensiondata.cloudcontrol.domain.Guest; +import org.jclouds.dimensiondata.cloudcontrol.domain.IdeController; +import org.jclouds.dimensiondata.cloudcontrol.domain.IdeDevice; +import org.jclouds.dimensiondata.cloudcontrol.domain.IdeDeviceOrDisk; +import org.jclouds.dimensiondata.cloudcontrol.domain.IdeDisk; import org.jclouds.dimensiondata.cloudcontrol.domain.NIC; import org.jclouds.dimensiondata.cloudcontrol.domain.NetworkInfo; import org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem; +import org.jclouds.dimensiondata.cloudcontrol.domain.SataController; +import org.jclouds.dimensiondata.cloudcontrol.domain.SataDevice; +import org.jclouds.dimensiondata.cloudcontrol.domain.SataDeviceOrDisk; +import org.jclouds.dimensiondata.cloudcontrol.domain.SataDisk; +import org.jclouds.dimensiondata.cloudcontrol.domain.ScsiController; +import org.jclouds.dimensiondata.cloudcontrol.domain.ScsiDisk; import org.jclouds.dimensiondata.cloudcontrol.domain.Server; +import org.jclouds.dimensiondata.cloudcontrol.domain.ServerSource; import org.jclouds.dimensiondata.cloudcontrol.domain.Servers; import org.jclouds.dimensiondata.cloudcontrol.domain.State; import org.jclouds.dimensiondata.cloudcontrol.domain.VirtualHardware; @@ -33,6 +46,7 @@ import javax.ws.rs.Consumes; import javax.ws.rs.core.MediaType; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -47,24 +61,60 @@ public String resource() { @Override @Consumes(MediaType.APPLICATION_JSON) public Servers expected() { + List ideDisksOrDevices = new ArrayList<>(); + ideDisksOrDevices.add(IdeDeviceOrDisk.builder().device( + IdeDevice.builder().id("fd70be3c-f068-4bbf-a55c-8c776a66ed5a").slot("0").sizeGb(1).fileName("WIN8DE") + .state(State.NORMAL).type("DVD").build()).build()); + ideDisksOrDevices.add(IdeDeviceOrDisk.builder() + .disk(IdeDisk.builder().id("98299851-37a3-4ebe-9cf1-090da9ae42a0").slot("1").sizeGb(10).speed("ECONOMY") + .state(State.NORMAL).build()).build()); + + List sataDisksOrDevices = Lists.newArrayList(); + sataDisksOrDevices.add(SataDeviceOrDisk.builder() + .disk(SataDisk.builder().id("98299853-37a3-4ebe-9cf1-090da9ae42a2").sataId("0").sizeGb(20).speed("STANDARD") + .state(State.NORMAL).build()).build()); + sataDisksOrDevices.add(SataDeviceOrDisk.builder().device( + SataDevice.builder().id("98299854-37a3-4ebe-9cf1-090da9ae42a3").sataId("1").sizeGb(1).fileName("WIN10CE") + .state(State.NORMAL).type("DVD").build()).build()); + + List scsiDisks = Lists.newArrayList( + ScsiDisk.builder().id("98299855-37a3-4ebe-9cf1-090da9ae42a4").scsiId("0").sizeGb(30) + .speed("HIGHPERFORMANCE").state(State.NORMAL).build()); + List servers = ImmutableList .of(Server.builder().id("b8246ba4-847d-475b-b296-f76787a69ca8").name("parser-test-server-name") .description("parser-test-server-description").datacenterId("NA9").state(State.NORMAL) - .sourceImageId("1e44ab3f-2426-45ec-a1b5-827b2ce58836") + .cluster(Cluster.builder().id("NA9-01").name("SAP Cluster").build()) + .source(ServerSource.builder().type("IMAGE_ID").value("1e44ab3f-2426-45ec-a1b5-827b2ce58836").build()) .createTime(parseDate("2016-03-10T13:05:21.000Z")).started(true).deployed(true).guest(Guest.builder() .operatingSystem( OperatingSystem.builder().id("CENTOS564").displayName("CENTOS5/64").family("UNIX") .build()).vmTools(VmTools.builder().apiVersion(9354).type(VmTools.Type.VMWARE_TOOLS) .versionStatus(VmTools.VersionStatus.NEED_UPGRADE) .runningStatus(VmTools.RunningStatus.RUNNING).build()).osCustomization(true).build()) - .cpu(CPU.builder().count(2).speed("STANDARD").coresPerSocket(1).build()).memoryGb(4).disks(Collections - .singletonList(Disk.builder().id("0ba67812-d7b7-4c3f-b114-870fbea24d42").scsiId(0).sizeGb(10) - .speed("STANDARD").state(State.NORMAL).build())).networkInfo(NetworkInfo.builder().primaryNic( - NIC.builder().id("980a9fdd-4ea2-478b-85b4-f016349f1738").privateIpv4("10.0.0.8") - .ipv6("2607:f480:111:1575:c47:7479:2af8:3f1a") - .vlanId("6b25b02e-d3a2-4e69-8ca7-9bab605deebd") - .vlanId("6b25b02e-d3a2-4e69-8ca7-9bab605deebd").vlanName("vlan1").state(State.NORMAL).build()) - .additionalNic(null).networkDomainId("690de302-bb80-49c6-b401-8c02bbefb945").build()) + .cpu(CPU.builder().count(2).speed("STANDARD").coresPerSocket(1).build()).memoryGb(4).ideControllers( + ImmutableList.of( + IdeController.builder().id("5bdfc88c-5509-420c-8c5d-cc7876dacfbe") + .adapterType("IDE_CONTROLLER_XXX").channel(0).key(3000) + .state(State.NORMAL).build(), + IdeController.builder().id("def96a00-d1ee-48b9-b07d-3993594724d0") + .adapterType("IDE_CONTROLLER_XXX").channel(1).key(3001) + .deviceOrDisks(ideDisksOrDevices).state(State.NORMAL).build())).sataControllers( + ImmutableList.of(SataController.builder().id("def96a01-d1ee-48b9-b07d-3993594724d1") + .adapterType("AHCI_CONTROLLER").busNumber(0).key(15000).deviceOrDisks(sataDisksOrDevices) + .state(State.NORMAL).build())).scsiControllers(ImmutableList + .of(ScsiController.builder().id("def96a02-d1ee-48b9-b07d-3993594724d2").adapterType("BUS_LOGIC") + .busNumber(0).key(1000).disks(scsiDisks).state(State.NORMAL).build())) + .floppies(ImmutableList.of(Floppy.builder().id("afeafa7e-742d-4902-a3f8-67d9bec5c160").driveNumber(0) + .key(8000).sizeGb(0).state(State.NORMAL).build())) + .networkInfo( + NetworkInfo.builder().primaryNic( + NIC.builder().id("980a9fdd-4ea2-478b-85b4-f016349f1738").privateIpv4("10.0.0.8") + .ipv6("2607:f480:111:1575:c47:7479:2af8:3f1a") + .vlanId("6b25b02e-d3a2-4e69-8ca7-9bab605deebd") + .vlanId("6b25b02e-d3a2-4e69-8ca7-9bab605deebd").vlanName("vlan1").state(State.NORMAL) + .build()).additionalNic(null) + .networkDomainId("690de302-bb80-49c6-b401-8c02bbefb945").build()) .virtualHardware(VirtualHardware.builder().upToDate(false).version("vmx-08").build()) .softwareLabels(Collections.emptyList()).build()); return new Servers(servers, 1, 5, 5, 250); diff --git a/dimensiondata/src/test/resources/server.json b/dimensiondata/src/test/resources/server.json index f0804e047..fa0f0bb0b 100644 --- a/dimensiondata/src/test/resources/server.json +++ b/dimensiondata/src/test/resources/server.json @@ -1,60 +1,164 @@ { - "name": "ServerApiLiveTest", + "name": "parser-test-server-name", + "description": "parser-test-server-description", + "cluster": { + "id": "NA9-01", + "name": "SAP Cluster" + }, "cpu": { "count": 2, "speed": "STANDARD", "coresPerSocket": 1 }, "memoryGb": 4, - "disk": [ + "scsiController": [ { - "id": "918f12ba-5e5e-4cd6-87bd-60c18293c24d", - "scsiId": 0, - "sizeGb": 20, - "speed": "STANDARD", - "state": "NORMAL" + "state": "NORMAL", + "id": "def96a02-d1ee-48b9-b07d-3993594724d2", + "adapterType": "BUS_LOGIC", + "key": 1000, + "disk": [ + { + "state": "NORMAL", + "id": "98299855-37a3-4ebe-9cf1-090da9ae42a4", + "sizeGb": 30, + "speed": "HIGHPERFORMANCE", + "scsiId": 0 + } + ], + "busNumber": 0 + } + ], + "sataController": [ + { + "state": "NORMAL", + "id": "def96a01-d1ee-48b9-b07d-3993594724d1", + "adapterType": "AHCI_CONTROLLER", + "key": 15000, + "deviceOrDisk": [ + { + "disk": { + "state": "NORMAL", + "id": "98299853-37a3-4ebe-9cf1-090da9ae42a2", + "sizeGb": 20, + "speed": "STANDARD", + "sataId": 0 + } + }, + { + "device": { + "state": "NORMAL", + "id": "98299854-37a3-4ebe-9cf1-090da9ae42a3", + "type": "DVD", + "sataId": 1, + "fileName": "WIN10CE", + "sizeGb": 1 + } + } + ], + "busNumber": 0 + } + ], + "ideController": [ + { + "state": "NORMAL", + "id": "5bdfc88c-5509-420c-8c5d-cc7876dacfbe", + "adapterType": "IDE_CONTROLLER_XXX", + "key": 3000, + "channel": 0 + }, + { + "state": "NORMAL", + "id": "def96a00-d1ee-48b9-b07d-3993594724d0", + "adapterType": "IDE_CONTROLLER_XXX", + "key": 3001, + "deviceOrDisk": [ + { + "device": { + "state": "NORMAL", + "id": "fd70be3c-f068-4bbf-a55c-8c776a66ed5a", + "type": "DVD", + "fileName": "WIN8DE", + "sizeGb": 1, + "slot": 0 + } + }, + { + "disk": { + "state": "NORMAL", + "id": "98299851-37a3-4ebe-9cf1-090da9ae42a0", + "speed": "ECONOMY", + "sizeGb": 10, + "slot": 1 + } + } + ], + "channel": 1 + } + ], + "floppy": [ + { + "state": "NORMAL", + "id": "afeafa7e-742d-4902-a3f8-67d9bec5c160", + "driveNumber": 0, + "key": 8000 } ], "networkInfo": { "primaryNic": { - "id": "f0c00cab-bfa3-4c51-8c0a-c52fdac1ae4b", - "privateIpv4": "10.0.0.7", + "id": "980a9fdd-4ea2-478b-85b4-f016349f1738", + "privateIpv4": "10.0.0.8", "ipv6": "2a00:47c0:111:1131:5851:1950:411c:3dd8", "vlanId": "7bd12a4d-4e83-4254-a266-174aa5f55187", "vlanName": "jclouds vlan", "networkAdapter": "E1000", - "macAddress": "00: 50: 56: bb: 53: 1e", - "key": 4000, + "macAddress": "11-2A-3B-C4-E5-66", + "key": "4000", "state": "NORMAL" }, - "additionalNic": [], + "additionalNic": null, "networkDomainId": "d122949b-8990-46d6-98f0-91c8676fc720" }, "softwareLabel": [], - "sourceImageId": "56eb0b7c-15a7-4b63-b373-05b962e37554", - "createTime": "2017-07-03T16:29:33.000Z", + "source": { + "type": "IMAGE_ID", + "value": "1e44ab3f-2426-45ec-a1b5-827b2ce58836" + }, + "createTime": "2016-03-10T13:05:21.000Z", "deployed": true, "started": true, "state": "NORMAL", "guest": { "operatingSystem": { - "id": "REDHAT764", - "displayName": "REDHAT7/64", + "id": "CENTOS564", + "displayName": "CENTOS5/64", "family": "UNIX" }, "vmTools": { "type": "VMWARE_TOOLS", - "versionStatus": "CURRENT", - "runningStatus": "NOT_RUNNING", - "apiVersion": 9356 + "versionStatus": "NEED_UPGRADE", + "runningStatus": "RUNNING", + "apiVersion": 9354 }, "osCustomization": true }, "virtualHardware": { - "version": "vmx-10", - "upToDate": true + "version": "vmx-08", + "upToDate": false }, - "tag": [], - "id": "cb08c7ba-7a51-4e32-8d39-05d2270f8f8b", - "datacenterId": "EU6" + "consistencyGroup": { + "id": "1234ef-1238933-2344adce-1098", + "name": "Test Consistency Group", + "status": "DRS_MODE", + "serverRole": "TARGET" + }, + "tag": [ + { + "tagKeyId": "883b91b3-702f-11e6-81fa-acaf67f59a21", + "tagKeyName": "Department", + "value": "IT" + } + ], + "id": "b8246ba4-847d-475b-b296-f76787a69ca8", + "datacenterId": "NA9" } \ No newline at end of file diff --git a/dimensiondata/src/test/resources/servers.json b/dimensiondata/src/test/resources/servers.json index 013ed163b..4af18a4da 100644 --- a/dimensiondata/src/test/resources/servers.json +++ b/dimensiondata/src/test/resources/servers.json @@ -13,13 +13,97 @@ "coresPerSocket": 1 }, "memoryGb": 4, - "disk": [ + "scsiController": [ { - "id": "0ba67812-d7b7-4c3f-b114-870fbea24d42", - "scsiId": 0, - "sizeGb": 10, - "speed": "STANDARD", - "state": "NORMAL" + "state": "NORMAL", + "id": "def96a02-d1ee-48b9-b07d-3993594724d2", + "adapterType": "BUS_LOGIC", + "key": 1000, + "disk": [ + { + "state": "NORMAL", + "id": "98299855-37a3-4ebe-9cf1-090da9ae42a4", + "sizeGb": 30, + "speed": "HIGHPERFORMANCE", + "scsiId": 0 + } + ], + "busNumber": 0 + } + ], + "sataController": [ + { + "state": "NORMAL", + "id": "def96a01-d1ee-48b9-b07d-3993594724d1", + "adapterType": "AHCI_CONTROLLER", + "key": 15000, + "deviceOrDisk": [ + { + "disk": { + "state": "NORMAL", + "id": "98299853-37a3-4ebe-9cf1-090da9ae42a2", + "sizeGb": 20, + "speed": "STANDARD", + "sataId": 0 + } + }, + { + "device": { + "state": "NORMAL", + "id": "98299854-37a3-4ebe-9cf1-090da9ae42a3", + "type": "DVD", + "sataId": 1, + "fileName": "WIN10CE", + "sizeGb": 1 + } + } + ], + "busNumber": 0 + } + ], + "ideController": [ + { + "state": "NORMAL", + "id": "5bdfc88c-5509-420c-8c5d-cc7876dacfbe", + "adapterType": "IDE_CONTROLLER_XXX", + "key": 3000, + "channel": 0 + }, + { + "state": "NORMAL", + "id": "def96a00-d1ee-48b9-b07d-3993594724d0", + "adapterType": "IDE_CONTROLLER_XXX", + "key": 3001, + "deviceOrDisk": [ + { + "device": { + "state": "NORMAL", + "id": "fd70be3c-f068-4bbf-a55c-8c776a66ed5a", + "type": "DVD", + "fileName": "WIN8DE", + "sizeGb": 1, + "slot": 0 + } + }, + { + "disk": { + "state": "NORMAL", + "id": "98299851-37a3-4ebe-9cf1-090da9ae42a0", + "speed": "ECONOMY", + "sizeGb": 10, + "slot": 1 + } + } + ], + "channel": 1 + } + ], + "floppy": [ + { + "state": "NORMAL", + "id": "afeafa7e-742d-4902-a3f8-67d9bec5c160", + "driveNumber": 0, + "key": 8000 } ], "networkInfo": { @@ -38,7 +122,10 @@ "networkDomainId": "690de302-bb80-49c6-b401-8c02bbefb945" }, "softwareLabel": [], - "sourceImageId": "1e44ab3f-2426-45ec-a1b5-827b2ce58836", + "source": { + "type": "IMAGE_ID", + "value": "1e44ab3f-2426-45ec-a1b5-827b2ce58836" + }, "createTime": "2016-03-10T13:05:21.000Z", "deployed": true, "started": true,