javatests/com/google/cloud/deploymentmanager/autogen/SpecValidationsTest.java (1,856 lines of code) (raw):
// Copyright 2018 Google LLC
//
// Licensed 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 com.google.cloud.deploymentmanager.autogen;
import static com.google.cloud.deploymentmanager.autogen.SpecValidations.validate;
import static com.google.cloud.deploymentmanager.autogen.SpecValidations.validateAccelerators;
import static com.google.cloud.deploymentmanager.autogen.SpecValidations.validateApplicationStatus;
import static com.google.cloud.deploymentmanager.autogen.SpecValidations.validateDeployInput;
import static com.google.cloud.deploymentmanager.autogen.SpecValidations.validateDeployInputFields;
import static com.google.cloud.deploymentmanager.autogen.SpecValidations.validateExternalIp;
import static com.google.cloud.deploymentmanager.autogen.SpecValidations.validateMultiVmBooleanExpression;
import static com.google.cloud.deploymentmanager.autogen.SpecValidations.validateMultiVmGceMetadataItems;
import static com.google.cloud.deploymentmanager.autogen.SpecValidations.validateMultiVmPasswords;
import static com.google.cloud.deploymentmanager.autogen.SpecValidations.validateMultiVmPostDeployInfo;
import static com.google.cloud.deploymentmanager.autogen.SpecValidations.validateSingleVmBooleanExpression;
import static com.google.cloud.deploymentmanager.autogen.SpecValidations.validateSingleVmGceMetadataItems;
import static com.google.cloud.deploymentmanager.autogen.SpecValidations.validateSingleVmPasswords;
import static com.google.cloud.deploymentmanager.autogen.SpecValidations.validateSingleVmPostDeployInfo;
import static com.google.cloud.deploymentmanager.autogen.SpecValidations.validateStackdriver;
import static com.google.cloud.deploymentmanager.autogen.SpecValidations.validateStartupScript;
import static com.google.common.truth.Truth.assertThat;
import com.google.cloud.deploymentmanager.autogen.proto.AcceleratorSpec;
import com.google.cloud.deploymentmanager.autogen.proto.ApplicationStatusSpec;
import com.google.cloud.deploymentmanager.autogen.proto.BooleanExpression;
import com.google.cloud.deploymentmanager.autogen.proto.BooleanExpression.BooleanDeployInputField;
import com.google.cloud.deploymentmanager.autogen.proto.BooleanExpression.ExternalIpAvailability;
import com.google.cloud.deploymentmanager.autogen.proto.DeployInputField;
import com.google.cloud.deploymentmanager.autogen.proto.DeployInputField.EmailBox;
import com.google.cloud.deploymentmanager.autogen.proto.DeployInputSection;
import com.google.cloud.deploymentmanager.autogen.proto.DeployInputSection.Placement;
import com.google.cloud.deploymentmanager.autogen.proto.DeployInputSpec;
import com.google.cloud.deploymentmanager.autogen.proto.DeploymentPackageAutogenSpec;
import com.google.cloud.deploymentmanager.autogen.proto.DeploymentPackageInput;
import com.google.cloud.deploymentmanager.autogen.proto.DiskSpec;
import com.google.cloud.deploymentmanager.autogen.proto.DiskSpec.DeviceName;
import com.google.cloud.deploymentmanager.autogen.proto.DiskSpec.DiskSize;
import com.google.cloud.deploymentmanager.autogen.proto.DiskSpec.DiskType;
import com.google.cloud.deploymentmanager.autogen.proto.ExternalIpSpec;
import com.google.cloud.deploymentmanager.autogen.proto.ExternalIpSpec.Type;
import com.google.cloud.deploymentmanager.autogen.proto.FirewallRuleSpec;
import com.google.cloud.deploymentmanager.autogen.proto.FirewallRuleSpec.TrafficSource;
import com.google.cloud.deploymentmanager.autogen.proto.GceMetadataItem;
import com.google.cloud.deploymentmanager.autogen.proto.GceMetadataItem.TierVmNames;
import com.google.cloud.deploymentmanager.autogen.proto.GceStartupScriptSpec;
import com.google.cloud.deploymentmanager.autogen.proto.GcpAuthScopeSpec;
import com.google.cloud.deploymentmanager.autogen.proto.ImageSpec;
import com.google.cloud.deploymentmanager.autogen.proto.InstanceUrlSpec;
import com.google.cloud.deploymentmanager.autogen.proto.MachineTypeSpec;
import com.google.cloud.deploymentmanager.autogen.proto.MachineTypeSpec.MachineType;
import com.google.cloud.deploymentmanager.autogen.proto.MachineTypeSpec.MachineTypeConstraint;
import com.google.cloud.deploymentmanager.autogen.proto.MultiVmDeploymentPackageSpec;
import com.google.cloud.deploymentmanager.autogen.proto.NetworkInterfacesSpec;
import com.google.cloud.deploymentmanager.autogen.proto.PasswordSpec;
import com.google.cloud.deploymentmanager.autogen.proto.PostDeployInfo;
import com.google.cloud.deploymentmanager.autogen.proto.PostDeployInfo.ConnectToInstanceSpec;
import com.google.cloud.deploymentmanager.autogen.proto.SingleVmDeploymentPackageSpec;
import com.google.cloud.deploymentmanager.autogen.proto.StackdriverSpec;
import com.google.cloud.deploymentmanager.autogen.proto.TierVmInstance;
import com.google.cloud.deploymentmanager.autogen.proto.VmTierSpec;
import com.google.common.collect.ImmutableList;
import com.google.inject.Guice;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import org.hamcrest.Matcher;
import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/** Tests {@link SpecValidations}. */
@RunWith(JUnit4.class)
public class SpecValidationsTest {
@Rule public ExpectedException thrown = ExpectedException.none();
private static final Autogen AUTOGEN =
Guice.createInjector(Autogen.getAutogenModule()).getInstance(Autogen.class);
@Test
public void missingAnyTier() {
expectIllegalArgumentException("At least one tier must be specified");
validate(MultiVmDeploymentPackageSpec.getDefaultInstance());
}
@Test
public void missingImage_single() {
expectIllegalArgumentException("At least one image must be specified");
validate(SingleVmDeploymentPackageSpec.getDefaultInstance());
}
@Test
public void missingImage_multi() {
expectIllegalArgumentException("At least one image must be specified");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpec();
builder.getTiersBuilder(0).clearImages();
builder.getTiersBuilder(1).clearImages();
validate(builder.build());
}
@Test
public void defaultMachineTypeMustBeValid_single() {
expectIllegalArgumentException("Default machine type name must be valid");
validate(newSingleSpecWithDefaults().setMachineType(invalidMachineTypeSpec()).build());
}
@Test
public void defaultMachineTypeMustBeValid_multi() {
expectIllegalArgumentException("Default machine type name must be valid");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(0).setMachineType(invalidMachineTypeSpec());
validate(builder.build());
}
@Test
public void validDefaultMachineType() {
validate(newSingleSpecWithDefaults().setMachineType(validMachineTypeSpec()).build());
}
@Test
public void validDefaultMachineType_multi() {
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(0).setMachineType(validMachineTypeSpec());
builder.getTiersBuilder(1).setMachineType(validMachineTypeSpec());
validate(builder.build());
}
@Test
public void defaultMachineTypeMustBeValidForAllTiers() {
expectIllegalArgumentException("Default machine type name must be valid");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(0).setMachineType(validMachineTypeSpec());
builder.getTiersBuilder(1).setMachineType(invalidMachineTypeSpec());
validate(builder.build());
}
@Test
public void minimumCpuMustBeNonnegative_single() {
expectIllegalArgumentException("Minimum CPUs must be nonnegative");
validate(newSingleSpecWithDefaults().setMachineType(machineTypeSpecWithNegativeCpu()).build());
}
@Test
public void minimumCpuMustBeNonnegative_multi() {
expectIllegalArgumentException("Minimum CPUs must be nonnegative");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1).setMachineType(machineTypeSpecWithNegativeCpu());
validate(builder.build());
}
@Test
public void minimumRamMustBeNonnegative_single() {
expectIllegalArgumentException("Minimum RAM must be nonnegative");
validate(newSingleSpecWithDefaults().setMachineType(machineTypeSpecWithNegativeRam()).build());
}
@Test
public void minimumRamMustBeNonnegative_multi() {
expectIllegalArgumentException("Minimum RAM must be nonnegative");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1).setMachineType(machineTypeSpecWithNegativeRam());
validate(builder.build());
}
@Test
public void validMinimumCpuAndRamUnset_single() {
validate(newSingleSpecWithDefaults().setMachineType(machineTypeSpecWithEmptyConstraint()).build());
}
@Test
public void validMinimumCpuAndRamUnset_multi() {
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1).setMachineType(machineTypeSpecWithEmptyConstraint());
validate(builder.build());
}
@Test
public void validMinimumCpuAndRamZero_single() {
validate(newSingleSpecWithDefaults().setMachineType(machineTypeSpecWithZeroes()).build());
}
@Test
public void validMinimumCpuAndRamZero_multi() {
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1).setMachineType(machineTypeSpecWithZeroes());
validate(builder.build());
}
@Test
public void validMinimumCpuAndRam_single() {
validate(newSingleSpecWithDefaults().setMachineType(machineTypeSpecWithValidMinimums()).build());
}
@Test
public void validMinimumCpuAndRam_multi() {
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(0).setMachineType(machineTypeSpecWithValidMinimums());
builder.getTiersBuilder(1).setMachineType(machineTypeSpecWithValidMinimums());
validate(builder.build());
}
@Test
public void bootDiskTypeMustBeSpecified_single() {
expectIllegalArgumentException("Disk type must be specified");
SingleVmDeploymentPackageSpec.Builder builder = newSingleSpecWithDefaults();
builder.getBootDiskBuilder().clearDiskType();
validate(builder.build());
}
@Test
public void bootDiskTypeMustBeSpecified_multi() {
expectIllegalArgumentException("Disk type must be specified");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1).getBootDiskBuilder().clearDiskType();
validate(builder.build());
}
@Test
public void additionalDiskTypeMustBeSpecified_single() {
expectIllegalArgumentException("Disk type must be specified");
SingleVmDeploymentPackageSpec.Builder builder = newSingleSpecWithDefaults();
builder.getAdditionalDisksBuilderList().get(0).clearDiskType();
validate(builder.build());
}
@Test
public void additionalDiskTypeMustBeSpecified_multi() {
expectIllegalArgumentException("Disk type must be specified");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1).getAdditionalDisksBuilderList().get(0).clearDiskType();
validate(builder.build());
}
@Test
public void invalidDefaultBootDiskType_single() {
expectIllegalArgumentException("A valid default disk type must be specified");
SingleVmDeploymentPackageSpec.Builder builder = newSingleSpecWithDefaults();
builder.getBootDiskBuilder().getDiskTypeBuilder().clearDefaultType();
validate(builder.build());
}
@Test
public void invalidDefaultBootDiskType_multi() {
expectIllegalArgumentException("A valid default disk type must be specified");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1).getBootDiskBuilder().getDiskTypeBuilder().clearDefaultType();
validate(builder.build());
}
@Test
public void invalidDefaultAdditionalDiskType_single() {
expectIllegalArgumentException("A valid default disk type must be specified");
SingleVmDeploymentPackageSpec.Builder builder = newSingleSpecWithDefaults();
builder.getAdditionalDisksBuilderList().get(0).getDiskTypeBuilder().clearDefaultType();
validate(builder.build());
}
@Test
public void invalidDefaultAdditionalDiskType_multi() {
expectIllegalArgumentException("A valid default disk type must be specified");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1)
.getAdditionalDisksBuilderList().get(0)
.getDiskTypeBuilder().clearDefaultType();
validate(builder.build());
}
@Test
public void bootDiskSizeMustBeSpecified_single() {
expectIllegalArgumentException("Disk size must be specified");
SingleVmDeploymentPackageSpec.Builder builder = newSingleSpecWithDefaults();
builder.getBootDiskBuilder().clearDiskSize();
validate(builder.build());
}
@Test
public void bootDiskSizeMustBeSpecified_multi() {
expectIllegalArgumentException("Disk size must be specified");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1).getBootDiskBuilder().clearDiskSize();
validate(builder.build());
}
@Test
public void additionalDiskSizeMustBeSpecified_single() {
expectIllegalArgumentException("Disk size must be specified");
SingleVmDeploymentPackageSpec.Builder builder = newSingleSpecWithDefaults();
builder.getAdditionalDisksBuilderList().get(0).clearDiskSize();
validate(builder.build());
}
@Test
public void additionalDiskSizeMustBeSpecified_multi() {
expectIllegalArgumentException("Disk size must be specified");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1).getAdditionalDisksBuilderList().get(0).clearDiskSize();
validate(builder.build());
}
@Test
public void invalidBootDiskSize_single() {
expectIllegalArgumentException("A valid default disk size must be specified");
SingleVmDeploymentPackageSpec.Builder builder = newSingleSpecWithDefaults();
builder.getBootDiskBuilder().getDiskSizeBuilder().clearDefaultSizeGb();
validate(builder.build());
}
@Test
public void invalidBootDiskSize_multi() {
expectIllegalArgumentException("A valid default disk size must be specified");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1).getBootDiskBuilder().getDiskSizeBuilder().clearDefaultSizeGb();
validate(builder.build());
}
@Test
public void invalidAdditionalDiskSize_single() {
expectIllegalArgumentException("A valid default disk size must be specified");
SingleVmDeploymentPackageSpec.Builder builder = newSingleSpecWithDefaults();
builder.getAdditionalDisksBuilderList().get(0).getDiskSizeBuilder().clearDefaultSizeGb();
validate(builder.build());
}
@Test
public void invalidAdditionalDiskSize_multi() {
expectIllegalArgumentException("A valid default disk size must be specified");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1)
.getAdditionalDisksBuilderList().get(0)
.getDiskSizeBuilder().clearDefaultSizeGb();
validate(builder.build());
}
@Test
public void invalidBootDiskDisplayLabel_single() {
expectIllegalArgumentException("A valid disk display label must be specified");
SingleVmDeploymentPackageSpec.Builder builder = newSingleSpecWithDefaults();
builder.getBootDiskBuilder().setDisplayLabel("");
validate(builder.build());
}
@Test
public void invalidBootDiskDisplayLabel_multi() {
expectIllegalArgumentException("A valid disk display label must be specified");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1).getBootDiskBuilder().setDisplayLabel("");
validate(builder.build());
}
@Test
public void invalidAdditionalDiskDisplayLabel_single() {
expectIllegalArgumentException("A valid disk display label must be specified");
SingleVmDeploymentPackageSpec.Builder builder = newSingleSpecWithDefaults();
builder.getAdditionalDisksBuilderList().get(0).setDisplayLabel("");
validate(builder.build());
}
@Test
public void invalidAdditionalDiskDisplayLabel_multi() {
expectIllegalArgumentException("A valid disk display label must be specified");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1).getAdditionalDisksBuilderList().get(0).setDisplayLabel("");
validate(builder.build());
}
@Test
public void validBootDisk_single() {
validate(newSingleSpecWithDefaults().setBootDisk(validBootDiskSpec()).build());
}
@Test
public void validBootDisk_multi() {
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(0).setBootDisk(validBootDiskSpec());
builder.getTiersBuilder(1).setBootDisk(validBootDiskSpec());
validate(builder.build());
}
@Test
public void validAdditionalDisks_single() {
SingleVmDeploymentPackageSpec.Builder spec = newSingleSpecWithDefaults();
for (DiskSpec disk : validAdditionalDisksSpec()) {
spec = spec.addAdditionalDisks(disk);
}
validate(spec.build());
}
@Test
public void validAdditionalDisks_multi() {
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
for (DiskSpec disk : validAdditionalDisksSpec()) {
builder.getTiersBuilder(0).addAdditionalDisks(disk);
builder.getTiersBuilder(1).addAdditionalDisks(disk);
}
validate(builder.build());
}
@Test
public void firewallRuleMustHaveValidProtocol_single() {
expectIllegalArgumentException("A firewall rule must have a valid protocol");
validate(newSingleSpecWithDefaults().addFirewallRules(firewallRuleWithoutProtocol()).build());
}
@Test
public void firewallRuleMustHaveValidProtocol_multi() {
expectIllegalArgumentException("A firewall rule must have a valid protocol");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(0).addFirewallRules(firewallRuleWithoutProtocol());
builder.getTiersBuilder(1).addFirewallRules(firewallRuleWithoutProtocol());
validate(builder.build());
}
@Test
public void firewallRuleMustHaveValidSource_single() {
expectIllegalArgumentException("A firewall rule must have a valid source");
validate(
newSingleSpecWithDefaults()
.addFirewallRules(firewallRuleWithoutAllowedSource())
.build());
}
@Test
public void allFirewallRulesMustBeValid_single() {
expectIllegalArgumentException("A firewall rule must have a valid protocol");
validate(
newSingleSpecWithDefaults()
.addFirewallRules(validHttpFirewallRule())
.addFirewallRules(firewallRuleWithoutProtocol())
.build());
}
@Test
public void firewallRulesIcmpMustNotHavePort_single() {
expectIllegalArgumentException("ICMP firewall rule must not specify a port");
SingleVmDeploymentPackageSpec.Builder builder = newSingleSpecWithDefaults();
builder.addFirewallRules(firewallRuleIcmpWithPort());
validate(builder.build());
}
@Test
public void firewallRulesIcmpMustNotHavePort_multi() {
expectIllegalArgumentException("ICMP firewall rule must not specify a port");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(0).addFirewallRules(firewallRuleIcmpWithPort());
validate(builder.build());
}
@Test
public void validFirewallRules_single() {
ImmutableList<FirewallRuleSpec> firewallRules =
ImmutableList.of(
validHttpFirewallRule(),
validHttpsFirewallRule());
validate(newSingleSpecWithDefaults().addAllFirewallRules(firewallRules).build());
}
@Test
public void validFirewallRules_multi() {
ImmutableList<FirewallRuleSpec> firewallRules =
ImmutableList.of(
validHttpFirewallRule(),
validHttpsFirewallRule(),
firewallRuleWithDeploymentSource());
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(0).addAllFirewallRules(firewallRules);
builder.getTiersBuilder(1).addAllFirewallRules(firewallRules.reverse());
validate(builder.build());
}
@Test
public void passwordMustHaveMetadataKey_single() {
expectIllegalArgumentException("Password must have a valid metadata key");
validateSingleVmPasswords(ImmutableList.of(passwordSpecWithoutMetadataKey()));
}
@Test
public void passwordMustHaveMetadataKey_multi() {
expectIllegalArgumentException("Password must have a valid metadata key");
validateMultiVmPasswords(ImmutableList.of(passwordSpecWithoutMetadataKey()));
}
@Test
public void passwordMustHaveLength_single() {
expectIllegalArgumentException("Password must have a valid length");
validateSingleVmPasswords(ImmutableList.of(passwordSpecWithoutLength()));
}
@Test
public void passwordMustHaveLength_multi() {
expectIllegalArgumentException("Password must have a valid length");
validateMultiVmPasswords(ImmutableList.of(passwordSpecWithoutLength()));
}
@Test
public void passwordMustHaveDisplayLabel_single() {
expectIllegalArgumentException("Password must have a valid display label");
validateSingleVmPasswords(ImmutableList.of(passwordSpecWithoutDisplayLabel()));
}
@Test
public void passwordMustHaveDisplayLabel_multi() {
expectIllegalArgumentException("Password must have a valid display label");
validateMultiVmPasswords(ImmutableList.of(passwordSpecWithoutDisplayLabel()));
}
@Test
public void passwordsCannotShareMetadataKeys_single() {
expectIllegalArgumentException("Metadata key 'password-key' is not unique");
validate(
newSingleSpecWithDefaults()
.addPasswords(validPasswordSpec())
.addPasswords(validPasswordSpec())
.build());
}
@Test
public void passwordsCannotShareMetadataKeys_multi() {
expectIllegalArgumentException("Metadata key 'password-key' is not unique");
validate(
newMultiSpecWithDefaults()
.addPasswords(validPasswordSpec())
.addPasswords(validPasswordSpec())
.build());
}
@Test
public void passwordMetadataKeysCannotBeInBlacklist_single() {
expectIllegalArgumentException(Matchers.startsWith("Password metadata key cannot be one of ["));
List<PasswordSpec> passwords = ImmutableList.of(passwordSpecWithBlacklistedMetadataKey());
validateSingleVmPasswords(passwords);
}
@Test
public void passwordMetadataKeysCannotBeInBlacklist_multi() {
expectIllegalArgumentException(Matchers.startsWith("Password metadata key cannot be one of ["));
List<PasswordSpec> passwords = ImmutableList.of(passwordSpecWithBlacklistedMetadataKey());
validateMultiVmPasswords(passwords);
}
@Test
public void passwordGeneratedConditionallyMustHaveValidBooleanExpression_input_single() {
expectIllegalArgumentException(
"Boolean expression for deploy input field must specify the field's name");
validate(
newSingleSpecWithDefaults()
.addPasswords(passwordSpecWithInvalidGenerateIfConditionForDeployInput())
.build());
}
@Test
public void passwordGeneratedConditionallyMustHaveValidBooleanExpression_input_multi() {
expectIllegalArgumentException(
"Boolean expression for deploy input field must specify the field's name");
validate(
newMultiSpecWithDefaults()
.addPasswords(passwordSpecWithInvalidGenerateIfConditionForDeployInput())
.build());
}
@Test
public void passwordGeneratedConditionallyMustHaveValidBooleanExpression_externalIp_single() {
expectIllegalArgumentException("Tier attribute must not be specified for has_external_ip "
+ "boolean expression in a single VM's spec");
validate(
newSingleSpecWithDefaults()
.addPasswords(passwordSpecWithInvalidGenerateIfConditionForExternalIp_single())
.build());
}
@Test
public void passwordGeneratedConditionallyMustHaveValidBooleanExpression_externalIp_multi() {
expectIllegalArgumentException("Tier attribute must be specified for has_external_ip "
+ "boolean expression in a multi VM's spec");
validate(
newMultiSpecWithDefaults()
.addPasswords(passwordSpecWithInvalidGenerateIfConditionForExternalIp_multi())
.build());
}
@Test
public void validPasswords_single() {
ImmutableList<PasswordSpec> passwordSpecs = ImmutableList.<PasswordSpec>builder()
.addAll(commonValidPasswordSpecs())
.add(passwordSpecWithValidGenerateIfConditionForExternalIp_single())
.build();
validateSingleVmPasswords(passwordSpecs);
}
@Test
public void validPasswords_multi() {
ImmutableList<PasswordSpec> passwordSpecs = ImmutableList.<PasswordSpec>builder()
.addAll(commonValidPasswordSpecs())
.add(passwordSpecWithValidGenerateIfConditionForExternalIp_multi())
.build();
validateMultiVmPasswords(passwordSpecs);
}
@Test
public void gcpAuthScopeMustHaveValidScope_single() {
expectIllegalArgumentException("The GcpAuthScopeSpec must have a valid scope value");
validate(
newSingleSpecWithDefaults()
.addGcpAuthScopes(GcpAuthScopeSpec.getDefaultInstance())
.build());
}
@Test
public void gcpAuthScopeMustHaveValidScope_multi() {
expectIllegalArgumentException("The GcpAuthScopeSpec must have a valid scope value");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1).addGcpAuthScopes(GcpAuthScopeSpec.getDefaultInstance());
validate(builder.build());
}
@Test
public void gcpAuthScopeMustNotBeDuplicated_single() {
expectIllegalArgumentException("Duplicate scope in GcpAuthScopeSpec list: COMPUTE");
validate(
newSingleSpecWithDefaults()
.addGcpAuthScopes(computeGcpAuthScopeSpec())
.addGcpAuthScopes(computeGcpAuthScopeSpec())
.build());
}
@Test
public void gcpAuthScopeMustNotBeDuplicated_multi() {
expectIllegalArgumentException("Duplicate scope in GcpAuthScopeSpec list: COMPUTE");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder
.getTiersBuilder(1)
.addGcpAuthScopes(computeGcpAuthScopeSpec())
.addGcpAuthScopes(computeGcpAuthScopeSpec());
validate(builder.build());
}
@Test
public void allGcpAuthScopesMustBeValid_single() {
expectIllegalArgumentException("The GcpAuthScopeSpec must have a valid scope value");
validate(
newSingleSpecWithDefaults()
.addGcpAuthScopes(computeGcpAuthScopeSpec())
.addGcpAuthScopes(GcpAuthScopeSpec.getDefaultInstance())
.build());
}
@Test
public void allGcpAuthScopesMustBeValid_multi() {
expectIllegalArgumentException("The GcpAuthScopeSpec must have a valid scope value");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder
.getTiersBuilder(1)
.addGcpAuthScopes(computeGcpAuthScopeSpec())
.addGcpAuthScopes(GcpAuthScopeSpec.getDefaultInstance());
validate(builder.build());
}
@Test
public void validGcpAuthScopes() {
ImmutableList<GcpAuthScopeSpec> authScopes =
ImmutableList.of(
computeGcpAuthScopeSpec(),
computeReadGcpAuthScopeSpec());
validate(newSingleSpecWithDefaults().addAllGcpAuthScopes(authScopes).build());
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(0).addAllGcpAuthScopes(authScopes);
builder.getTiersBuilder(1).addAllGcpAuthScopes(authScopes.reverse());
validate(builder.build());
}
@Test
public void adminUrlMustHaveScheme_single() {
expectIllegalArgumentException("A scheme is required for Admin URL");
validate(newSingleSpecWithDefaults().setAdminUrl(InstanceUrlSpec.getDefaultInstance()).build());
}
@Test
public void adminUrlMustHaveScheme_multi() {
expectIllegalArgumentException("A scheme is required for Admin URL");
validate(newMultiSpecWithDefaults().setAdminUrl(InstanceUrlSpec.getDefaultInstance()).build());
}
@Test
public void adminUrlMustSpecifyTierVmForMulti() {
expectIllegalArgumentException("A tier VM is required for Admin URL");
validate(newMultiSpecWithDefaults().setAdminUrl(validSingleInstanceUrl()).build());
}
@Test
public void adminUrlTierVmMustHaveTier() {
expectIllegalArgumentException("Tier VM must have a valid tier for Admin URL");
validate(
newMultiSpecWithDefaults()
.setAdminUrl(multiInstanceUrlWithTierVmButNoTier())
.build());
}
@Test
public void validAdminUrl_single() {
validate(newSingleSpecWithDefaults().setAdminUrl(validSingleInstanceUrl()).build());
}
@Test
public void validAdminUrl_multi() {
validate(newMultiSpecWithDefaults().setAdminUrl(validMultiInstanceUrl()).build());
}
@Test
public void siteUrlMustHaveScheme_single() {
expectIllegalArgumentException("A scheme is required for Site URL");
validate(newSingleSpecWithDefaults().setSiteUrl(InstanceUrlSpec.getDefaultInstance()).build());
}
@Test
public void siteUrlMustHaveScheme_multi() {
expectIllegalArgumentException("A scheme is required for Site URL");
validate(newMultiSpecWithDefaults().setSiteUrl(InstanceUrlSpec.getDefaultInstance()).build());
}
@Test
public void siteUrlMustSpecifyTierVmForMulti() {
expectIllegalArgumentException("A tier VM is required for Site URL");
validate(newMultiSpecWithDefaults().setSiteUrl(validSingleInstanceUrl()).build());
}
@Test
public void siteUrlTierVmMustHaveTier() {
expectIllegalArgumentException("Tier VM must have a valid tier for Site URL");
validate(
newMultiSpecWithDefaults()
.setSiteUrl(multiInstanceUrlWithTierVmButNoTier())
.build());
}
@Test
public void validSiteUrl_single() {
validate(newSingleSpecWithDefaults().setSiteUrl(validSingleInstanceUrl()).build());
}
@Test
public void validSiteUrl_multi() {
validate(newMultiSpecWithDefaults().setSiteUrl(validMultiInstanceUrl()).build());
}
@Test
public void connectButtonMustNotSpecifyTierVm_single() {
expectIllegalArgumentException(
"Tier VM must not be specified for a single vm spec");
ConnectToInstanceSpec button = ConnectToInstanceSpec
.newBuilder(validSingleInstanceConnectButton())
.setTierVm(TierVmInstance.newBuilder().setTier("tier0"))
.build();
validate(newSingleSpecWithDefaults()
.setPostDeploy(PostDeployInfo.newBuilder().setConnectButton(button))
.build());
}
@Test
public void connectButtonMustSpecifyTierVm_multi() {
expectIllegalArgumentException(
"Multi-vm connect button spec must specify valid tier name");
ConnectToInstanceSpec button = ConnectToInstanceSpec.newBuilder().build();
validate(newMultiSpecWithDefaults()
.setPostDeploy(PostDeployInfo.newBuilder().setConnectButton(button))
.build());
}
@Test
public void connectButtonMustSpecifyNonEmptyTierVm_multi() {
expectIllegalArgumentException(
"Multi-vm connect button spec must specify valid tier name");
ConnectToInstanceSpec button = ConnectToInstanceSpec.newBuilder()
.setTierVm(TierVmInstance.newBuilder().setTier(""))
.build();
validate(newMultiSpecWithDefaults()
.setPostDeploy(PostDeployInfo.newBuilder().setConnectButton(button))
.build());
}
@Test
public void validConnectButtonMayHaveEmptyDisplayLabel() {
PostDeployInfo singleVmPostDeployInfo = buildPostDeployInfoWithConnectButton(
validSingleInstanceConnectButton(""), "non-empty label");
validate(newSingleSpecWithDefaults()
.setPostDeploy(singleVmPostDeployInfo)
.build());
PostDeployInfo multiVmPostDeployInfo = buildPostDeployInfoWithConnectButton(
validMultiInstanceConnectButton(""), "non-empty label");
validate(newMultiSpecWithDefaults()
.setPostDeploy(multiVmPostDeployInfo)
.build());
}
@Test
public void validConnectButtonMayHaveEmptyDeprecatedConnectButtonLabel() {
PostDeployInfo singleVmPostDeployInfo = buildPostDeployInfoWithConnectButton(
validSingleInstanceConnectButton("non-empty label"), "");
validate(newSingleSpecWithDefaults()
.setPostDeploy(singleVmPostDeployInfo)
.build());
PostDeployInfo multiVmPostDeployInfo = buildPostDeployInfoWithConnectButton(
validMultiInstanceConnectButton("non-empty label"), "");
validate(newMultiSpecWithDefaults()
.setPostDeploy(multiVmPostDeployInfo)
.build());
}
@Test
public void connectButtonDisplayLabelsSpecsMustBeTheSameIfBothNotEmpty_single() {
expectIllegalArgumentException(
"At most only one of connect button's display_label and post deploy's connect_button_label "
+ "can be specified, or they must have the same value");
PostDeployInfo postDeployInfo = buildPostDeployInfoWithConnectButton(
validSingleInstanceConnectButton("First label"),
"Second label");
validate(newSingleSpecWithDefaults()
.setPostDeploy(postDeployInfo)
.build());
}
@Test
public void connectButtonDisplayLabelsSpecsMustBeTheSameIfBothNotEmpty_multi() {
expectIllegalArgumentException(
"At most only one of connect button's display_label and post deploy's connect_button_label "
+ "can be specified, or they must have the same value");
PostDeployInfo postDeployInfo = buildPostDeployInfoWithConnectButton(
validMultiInstanceConnectButton("First label"),
"Second label");
validate(newMultiSpecWithDefaults()
.setPostDeploy(postDeployInfo)
.build());
}
@Test
public void validConnectButton_single() {
PostDeployInfo postDeployInfo = PostDeployInfo.newBuilder()
.setConnectButton(validSingleInstanceConnectButton())
.build();
validate(newSingleSpecWithDefaults()
.setPostDeploy(postDeployInfo)
.build());
}
@Test
public void validConnectButton_multi() {
PostDeployInfo postDeployInfo = PostDeployInfo.newBuilder()
.setConnectButton(validMultiInstanceConnectButton())
.build();
validate(newMultiSpecWithDefaults()
.setPostDeploy(postDeployInfo)
.build());
}
@Test
public void applicationStatus_waiterSpecOnlyForWaiterType() {
expectIllegalArgumentException(
"Waiter spec should only be set for an application status of type WAITER");
ApplicationStatusSpec.Builder appStatus = ApplicationStatusSpec.newBuilder();
appStatus.getWaiterBuilder();
validateApplicationStatus(appStatus.build());
}
@Test
public void applicationStatus_waiterSpecExpectedForWaiterType() {
expectIllegalArgumentException(
"Application status of type WAITER must have a valid waiter spec");
ApplicationStatusSpec.Builder appStatus =
ApplicationStatusSpec.newBuilder().setType(ApplicationStatusSpec.StatusType.WAITER);
validateApplicationStatus(appStatus.build());
}
@Test
public void applicationStatus_waiterMustHaveValidTimeout() {
expectIllegalArgumentException("Application status waiter must have a valid timeout");
ApplicationStatusSpec.Builder appStatus =
ApplicationStatusSpec.newBuilder().setType(ApplicationStatusSpec.StatusType.WAITER);
appStatus.getWaiterBuilder();
validateApplicationStatus(appStatus.build());
}
@Test
public void applicationStatus_waiterScriptMustHaveValidTimeout() {
expectIllegalArgumentException("Application status waiter script must have a valid timeout");
ApplicationStatusSpec.Builder appStatus =
ApplicationStatusSpec.newBuilder().setType(ApplicationStatusSpec.StatusType.WAITER);
appStatus.getWaiterBuilder().setWaiterTimeoutSecs(300).getScriptBuilder();
validateApplicationStatus(appStatus.build());
}
@Test
public void applicationStatus_validWaiterWithScript() {
ApplicationStatusSpec.Builder appStatusBuilder =
ApplicationStatusSpec.newBuilder().setType(ApplicationStatusSpec.StatusType.WAITER);
appStatusBuilder
.getWaiterBuilder()
.setWaiterTimeoutSecs(300)
.getScriptBuilder()
.setCheckTimeoutSecs(300)
.setCheckScriptContent("bin bash");
validateApplicationStatus(appStatusBuilder.build());
}
@Test
public void postDeployActionItem_mustHaveHeading_single() {
expectIllegalArgumentException("Post deploy action item must have a valid heading");
PostDeployInfo postDeployInfo =
PostDeployInfo.newBuilder()
.addActionItems(PostDeployInfo.ActionItem.getDefaultInstance())
.build();
validateSingleVmPostDeployInfo(postDeployInfo);
}
@Test
public void postDeployActionItem_mustHaveHeading_multi() {
expectIllegalArgumentException("Post deploy action item must have a valid heading");
PostDeployInfo postDeployInfo =
PostDeployInfo.newBuilder()
.addActionItems(PostDeployInfo.ActionItem.getDefaultInstance())
.build();
validateMultiVmPostDeployInfo(postDeployInfo);
}
@Test
public void postDeployActionItem_mustHaveAtLeastDescriptionOrSnippet_single() {
expectIllegalArgumentException(
"Post deploy action item must have at least description or snippet");
PostDeployInfo postDeployInfo =
PostDeployInfo.newBuilder()
.addActionItems(PostDeployInfo.ActionItem.newBuilder().setHeading("Action heading"))
.build();
validateSingleVmPostDeployInfo(postDeployInfo);
}
@Test
public void postDeployActionItem_mustHaveAtLeastDescriptionOrSnippet_multi() {
expectIllegalArgumentException(
"Post deploy action item must have at least description or snippet");
PostDeployInfo postDeployInfo =
PostDeployInfo.newBuilder()
.addActionItems(PostDeployInfo.ActionItem.newBuilder().setHeading("Action heading"))
.build();
validateMultiVmPostDeployInfo(postDeployInfo);
}
@Test
public void postDeployActionItem_ifPresentShowIfExpressionMustBeValid_input_single() {
expectIllegalArgumentException(
"Boolean expression for deploy input field must specify the field's name");
PostDeployInfo postDeployInfo = buildPostDeployInfoWithActionItemShowIfNotSpecifyingFieldName();
validateSingleVmPostDeployInfo(postDeployInfo);
}
@Test
public void postDeployActionItem_ifPresentShowIfExpressionMustBeValid_input_multi() {
expectIllegalArgumentException(
"Boolean expression for deploy input field must specify the field's name");
PostDeployInfo postDeployInfo = buildPostDeployInfoWithActionItemShowIfNotSpecifyingFieldName();
validateMultiVmPostDeployInfo(postDeployInfo);
}
@Test
public void postDeployActionItem_ifPresentShowIfExpressionMustBeValid_externalIp_single() {
expectIllegalArgumentException("Tier attribute must not be specified for has_external_ip "
+ "boolean expression in a single VM's spec");
PostDeployInfo.ActionItem actionItem =
PostDeployInfo.ActionItem.newBuilder()
.setHeading("Action heading")
.setDescription("Some description")
.setShowIf(newBooleanExternalIpExpressionWithTierName())
.build();
PostDeployInfo postDeployInfo = PostDeployInfo.newBuilder().addActionItems(actionItem).build();
validateSingleVmPostDeployInfo(postDeployInfo);
}
@Test
public void postDeployActionItem_ifPresentShowIfExpressionMustBeValid_externalIp_multi() {
expectIllegalArgumentException("Tier attribute must be specified for has_external_ip "
+ "boolean expression in a multi VM's spec");
PostDeployInfo.ActionItem actionItem =
PostDeployInfo.ActionItem.newBuilder()
.setHeading("Action heading")
.setDescription("Some description")
.setShowIf(newBooleanExternalIpExpressionWithoutTierName())
.build();
PostDeployInfo postDeployInfo = PostDeployInfo.newBuilder().addActionItems(actionItem).build();
validateMultiVmPostDeployInfo(postDeployInfo);
}
@Test
public void postDeployActionItem_valid_single() {
PostDeployInfo postDeployInfo = buildValidActionItemsInPostDeployInfo();
validateSingleVmPostDeployInfo(postDeployInfo);
}
@Test
public void postDeployActionItem_valid_multi() {
PostDeployInfo postDeployInfo = buildValidActionItemsInPostDeployInfo();
validateMultiVmPostDeployInfo(postDeployInfo);
}
private PostDeployInfo buildValidActionItemsInPostDeployInfo() {
return PostDeployInfo.newBuilder()
.addActionItems(
PostDeployInfo.ActionItem.newBuilder()
.setHeading("Action heading")
.setDescription("description"))
.addActionItems(
PostDeployInfo.ActionItem.newBuilder()
.setHeading("Action heading")
.setSnippet("snippet"))
.addActionItems(
PostDeployInfo.ActionItem.newBuilder()
.setHeading("Action heading")
.setDescription("description")
.setSnippet("snippet"))
.addActionItems(
PostDeployInfo.ActionItem.newBuilder()
.setHeading("Action heading")
.setDescription("description")
.setSnippet("snippet")
.setShowIf(newValidBooleanDeployInputFieldExpression()))
.build();
}
@Test
public void postDeployInfoRow_ifPresentShowIfExpressionMustBeValid_input_single() {
expectIllegalArgumentException(
"Boolean expression for deploy input field must specify the field's name");
PostDeployInfo postDeployInfo =
buildInfoRowWithShowIfExpression(newInvalidBooleanDeployInputFieldExpression());
validateSingleVmPostDeployInfo(postDeployInfo);
}
@Test
public void postDeployInfoRow_ifPresentShowIfExpressionMustBeValid_input_multi() {
expectIllegalArgumentException(
"Boolean expression for deploy input field must specify the field's name");
PostDeployInfo postDeployInfo =
buildInfoRowWithShowIfExpression(newInvalidBooleanDeployInputFieldExpression());
validateMultiVmPostDeployInfo(postDeployInfo);
}
@Test
public void postDeployInfoRow_ifPresentShowIfExpressionMustBeValid_externalIp_single() {
expectIllegalArgumentException("Tier attribute must not be specified for has_external_ip "
+ "boolean expression in a single VM's spec");
PostDeployInfo postDeployInfo =
buildInfoRowWithShowIfExpression(newBooleanExternalIpExpressionWithTierName());
validateSingleVmPostDeployInfo(postDeployInfo);
}
@Test
public void postDeployInfoRow_ifPresentShowIfExpressionMustBeValid_externalIp_multi() {
expectIllegalArgumentException("Tier attribute must be specified for has_external_ip "
+ "boolean expression in a multi VM's spec");
PostDeployInfo postDeployInfo =
buildInfoRowWithShowIfExpression(newBooleanExternalIpExpressionWithoutTierName());
validateMultiVmPostDeployInfo(postDeployInfo);
}
private PostDeployInfo buildInfoRowWithShowIfExpression(BooleanExpression expression) {
PostDeployInfo.InfoRow infoRow =
PostDeployInfo.InfoRow.newBuilder()
.setLabel("My label")
.setValue("Some value")
.setShowIf(expression)
.build();
return PostDeployInfo.newBuilder().addInfoRows(infoRow).build();
}
@Test
public void postDeployInfoRow_valueShouldNotExceedTheLimit_single() {
expectIllegalArgumentException(String.format(
"Info row value length cannot exceed the limit of %d characters",
SpecValidations.INFO_ROW_MAX_LENGTH));
PostDeployInfo postDeployInfo = buildInfoRowWithTooLongValue();
validateSingleVmPostDeployInfo(postDeployInfo);
}
@Test
public void postDeployInfoRow_valueShouldNotExceedTheLimit_multi() {
expectIllegalArgumentException(String.format(
"Info row value length cannot exceed the limit of %d characters",
SpecValidations.INFO_ROW_MAX_LENGTH));
PostDeployInfo postDeployInfo = buildInfoRowWithTooLongValue();
validateMultiVmPostDeployInfo(postDeployInfo);
}
private PostDeployInfo buildInfoRowWithTooLongValue() {
StringBuilder longString = new StringBuilder();
for (int i = 0; i < 50; i++) {
longString.append("abc ");
}
PostDeployInfo.InfoRow infoRow =
PostDeployInfo.InfoRow.newBuilder()
.setLabel("My label")
.setValue(longString.toString())
.build();
return PostDeployInfo.newBuilder().addInfoRows(infoRow).build();
}
@Test
public void postDeployInfoRow_valueFromDeployInputFieldShouldNotBeEmpty_single() {
expectIllegalArgumentException(
"Expected non-empty deploy input field name for info row value");
PostDeployInfo postDeployInfo = buildInfoRowWithEmptyDeployInputField();
validateSingleVmPostDeployInfo(postDeployInfo);
}
@Test
public void postDeployInfoRow_valueFromDeployInputFieldShouldNotBeEmpty_multi() {
expectIllegalArgumentException(
"Expected non-empty deploy input field name for info row value");
PostDeployInfo postDeployInfo = buildInfoRowWithEmptyDeployInputField();
validateMultiVmPostDeployInfo(postDeployInfo);
}
private PostDeployInfo buildInfoRowWithEmptyDeployInputField() {
PostDeployInfo.InfoRow infoRow =
PostDeployInfo.InfoRow.newBuilder()
.setLabel("My label")
.setValueFromDeployInputField("")
.build();
return PostDeployInfo.newBuilder().addInfoRows(infoRow).build();
}
@Test
public void postDeployInfoRow_shouldSpecifyValue_single() {
expectIllegalArgumentException("Unexpected info row value");
PostDeployInfo postDeployInfo = buildInfoRowWithoutValue();
validateSingleVmPostDeployInfo(postDeployInfo);
}
@Test
public void postDeployInfoRow_shouldSpecifyValue_multi() {
expectIllegalArgumentException("Unexpected info row value");
PostDeployInfo postDeployInfo = buildInfoRowWithoutValue();
validateMultiVmPostDeployInfo(postDeployInfo);
}
private PostDeployInfo buildInfoRowWithoutValue() {
PostDeployInfo.InfoRow infoRow =
PostDeployInfo.InfoRow.newBuilder().setLabel("My label").build();
return PostDeployInfo.newBuilder().addInfoRows(infoRow).build();
}
@Test
public void gceMetadataItemsMustHaveValidKey() {
expectIllegalArgumentException("GCE metadata item must have a valid key");
GceMetadataItem metadataItem = GceMetadataItem.newBuilder().setValue("value").build();
validateSingleVmGceMetadataItems(ImmutableList.of(metadataItem));
validateMultiVmGceMetadataItems(ImmutableList.of(metadataItem));
}
@Test
public void gceMetadataItemKeysCannotBeInBlacklist() {
expectIllegalArgumentException(Matchers.startsWith("GCE metadata item key cannot be one of ["));
GceMetadataItem metadataItem =
GceMetadataItem.newBuilder().setKey("startup-script").setValue("value").build();
validateSingleVmGceMetadataItems(ImmutableList.of(metadataItem));
validateMultiVmGceMetadataItems(ImmutableList.of(metadataItem));
}
@Test
public void gceMetadataItemsCannotShareKeys_single() {
expectIllegalArgumentException("Metadata key 'key' is not unique");
GceMetadataItem metadataItem =
GceMetadataItem.newBuilder().setKey("key").setValue("value").build();
validate(
newSingleSpecWithDefaults()
.addGceMetadataItems(metadataItem)
.addGceMetadataItems(metadataItem)
.build());
}
@Test
public void gceMetadataItemsCannotShareKeys_multi() {
expectIllegalArgumentException("Metadata key 'key' is not unique");
GceMetadataItem metadataItem =
GceMetadataItem.newBuilder().setKey("key").setValue("value").build();
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(0).addGceMetadataItems(metadataItem).addGceMetadataItems(metadataItem);
validate(builder.build());
}
@Test
public void gceMetadataItemsAcrossTiersCanShareKeys() {
GceMetadataItem metadataItem =
GceMetadataItem.newBuilder().setKey("key").setValue("value").build();
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.addTiersBuilder().mergeFrom(builder.getTiers(0)).setName("tier2");
// These three define the same key but they are in separate tiers.
// Three tiers can discover a bug that 2 tiers wouldn't catch!
builder.getTiersBuilder(0).addGceMetadataItems(metadataItem);
builder.getTiersBuilder(1).addGceMetadataItems(metadataItem);
builder.getTiersBuilder(2).addGceMetadataItems(metadataItem);
validate(builder.build());
}
@Test
public void gceMetadataItemsMustHaveValidValue() {
expectIllegalArgumentException("GCE metadata item must have a valid value");
GceMetadataItem metadataItem = GceMetadataItem.newBuilder().setKey("key").build();
validateSingleVmGceMetadataItems(ImmutableList.of(metadataItem));
validateMultiVmGceMetadataItems(ImmutableList.of(metadataItem));
}
@Test
public void gceMetadataItemsCannotUseTierVmForSingleVm() {
expectIllegalArgumentException("GCE metadata item for single VM cannot specify tier VM");
GceMetadataItem metadataItem =
GceMetadataItem.newBuilder()
.setKey("key")
.setTierVmNames(TierVmNames.newBuilder().setTier("tier0"))
.build();
validateSingleVmGceMetadataItems(ImmutableList.of(metadataItem));
}
@Test
public void validGceMetadataItemsWithValue() {
GceMetadataItem metadataItem =
GceMetadataItem.newBuilder().setKey("key").setValue("value").build();
validateSingleVmGceMetadataItems(ImmutableList.of(metadataItem));
validateMultiVmGceMetadataItems(ImmutableList.of(metadataItem));
}
@Test
public void validGceMetadataItemsWithTierVm() {
GceMetadataItem metadataItem =
GceMetadataItem.newBuilder()
.setKey("key")
.setTierVmNames(TierVmNames.newBuilder().setTier("tier0"))
.build();
validateMultiVmGceMetadataItems(ImmutableList.of(metadataItem));
}
@Test
public void metadataKeysCannotBeSharedAmongPasswordsAndGceMetadataItems_single() {
expectIllegalArgumentException("Metadata key 'admin' is not unique");
PasswordSpec passwordSpec =
PasswordSpec.newBuilder()
.setLength(8)
.setMetadataKey("admin")
.setDisplayLabel("Admin")
.build();
GceMetadataItem metadataItem =
GceMetadataItem.newBuilder().setKey("admin").setValue("value").build();
validate(
newSingleSpecWithDefaults()
.addPasswords(passwordSpec)
.addGceMetadataItems(metadataItem)
.build());
}
@Test
public void metadataKeysCannotBeSharedAmongPasswordsAndGceMetadataItems_multi() {
expectIllegalArgumentException("Metadata key 'admin' is not unique");
PasswordSpec passwordSpec =
PasswordSpec.newBuilder()
.setLength(8)
.setMetadataKey("admin")
.setDisplayLabel("Admin")
.build();
GceMetadataItem metadataItem =
GceMetadataItem.newBuilder().setKey("admin").setValue("value").build();
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.addPasswords(passwordSpec);
builder.getTiersBuilder(0).addGceMetadataItems(metadataItem);
validate(builder.build());
}
@Test
public void validAcceleratorSpec() {
AcceleratorSpec accelerator = AcceleratorSpec.newBuilder()
.addTypes("nvidia-tesla-k80")
.addTypes("nvidia-tesla-p100")
.addTypes("nvidia-tesla-v100")
.setDefaultCount(1)
.build();
validateAccelerators(ImmutableList.of(accelerator));
}
@Test
public void invalidAcceleratorSpec_unsupportedTypes() {
expectIllegalArgumentException("Unsupported accelerator types: [nvidia-tesla-k801]");
AcceleratorSpec accelerator = AcceleratorSpec.newBuilder()
.addTypes("nvidia-tesla-k80")
.addTypes("nvidia-tesla-k801")
.setDefaultCount(1)
.build();
validateAccelerators(ImmutableList.of(accelerator));
}
@Test
public void invalidAcceleratorSpec_invalidDefaultType() {
final List<String> types = Arrays.asList("nvidia-tesla-k80", "nvidia-tesla-v100");
final String invalidDefaultType = "nvidia-tesla-p100";
expectIllegalArgumentException(
String.format("Default Accelerator Type must be one of %s", types));
AcceleratorSpec accelerator =
AcceleratorSpec.newBuilder()
.addAllTypes(types)
.setDefaultType(invalidDefaultType)
.setDefaultCount(1)
.build();
validateAccelerators(ImmutableList.of(accelerator));
}
@Test
public void deployInputSectionsCannotShareNames() {
DeployInputField.Builder fieldTemplate = DeployInputField.newBuilder().setTitle("Field title");
fieldTemplate.getBooleanCheckboxBuilder();
DeployInputSection.Builder sectionTemplate = DeployInputSection.newBuilder()
.setTitle("Section title").setPlacement(Placement.CUSTOM_BOTTOM);
DeployInputSpec inputSpec =
DeployInputSpec.newBuilder()
.addSections(
sectionTemplate.clone()
.setName("section0")
.addFields(fieldTemplate.clone().setName("f0")))
.addSections(
sectionTemplate.clone()
.setName("section0")
.addFields(fieldTemplate.clone().setName("f1")))
.build();
expectIllegalArgumentException("Deploy input sections with the same name: section0");
validateDeployInput(inputSpec);
}
@Test
public void deployInputFieldsCannotShareNamesEvenAcrossSections() {
DeployInputField.Builder fieldTemplate = DeployInputField.newBuilder().setTitle("Field title");
fieldTemplate.getBooleanCheckboxBuilder();
DeployInputSection.Builder sectionTemplate = DeployInputSection.newBuilder()
.setTitle("Section title").setPlacement(Placement.CUSTOM_BOTTOM);
DeployInputSpec inputSpec =
DeployInputSpec.newBuilder()
.addSections(
sectionTemplate.clone()
.setName("section0")
.addFields(fieldTemplate.clone().setName("f0")))
.addSections(
sectionTemplate.clone()
.setName("section1")
.addFields(fieldTemplate.clone().setName("f0")))
.build();
expectIllegalArgumentException("Deploy input fields with the same name: f0");
validateDeployInput(inputSpec);
}
@Test
public void deployInputDisplayGroupsCannotShareNamesEvenAcrossSections() {
DeployInputField.Builder fieldTemplate = DeployInputField.newBuilder().setTitle("Field title");
fieldTemplate.getGroupedBooleanCheckboxBuilder()
.getDisplayGroupBuilder().setName("dg").setTitle("Display group");
DeployInputSection.Builder sectionTemplate = DeployInputSection.newBuilder()
.setTitle("Section title").setPlacement(Placement.CUSTOM_BOTTOM);
DeployInputSpec inputSpec =
DeployInputSpec.newBuilder()
.addSections(
sectionTemplate.clone()
.setName("section0")
.addFields(fieldTemplate.clone().setName("f0")))
.addSections(
sectionTemplate.clone()
.setName("section1")
.addFields(fieldTemplate.clone().setName("f1")))
.build();
expectIllegalArgumentException("Display groups with the same name: dg");
validateDeployInput(inputSpec);
}
@Test
public void deployInputGroupedBooleanCheckboxMustHaveDisplayGroup() {
DeployInputField.Builder field =
DeployInputField.newBuilder().setTitle("Field title").setName("f0");
field.getGroupedBooleanCheckboxBuilder();
DeployInputSpec inputSpec =
DeployInputSpec.newBuilder()
.addSections(
DeployInputSection.newBuilder()
.setPlacement(Placement.CUSTOM_BOTTOM)
.setName("section0")
.setTitle("Section title")
.addFields(field))
.build();
expectIllegalArgumentException(
"The first grouped boolean checkbox 'f0' must have a display group");
validateDeployInput(inputSpec);
}
@Test
public void validConsecutiveGroupBooleanCheckboxGroups() {
DeployInputSection.Builder section = DeployInputSection.newBuilder()
.setPlacement(Placement.CUSTOM_BOTTOM)
.setName("section0")
.setTitle("Section title");
section.addFieldsBuilder()
.setName("f0")
.setTitle("Field 0")
.getGroupedBooleanCheckboxBuilder()
.getDisplayGroupBuilder()
.setName("dg0")
.setTitle("Display 0");
section.addFieldsBuilder()
.setName("f1")
.setTitle("Field 1")
.getGroupedBooleanCheckboxBuilder()
.getDisplayGroupBuilder()
.setName("dg1")
.setTitle("Display 1");
section.addFieldsBuilder()
.setName("f2")
.setTitle("Field 2")
.getGroupedBooleanCheckboxBuilder();
validateDeployInput(DeployInputSpec.newBuilder().addSections(section).build());
}
@Test
public void externalIpMustNotHaveTierNameForSingleVm() {
expectIllegalArgumentException("Tier attribute must not be specified for has_external_ip "
+ "boolean expression in a single VM's spec");
ExternalIpAvailability externalIp = ExternalIpAvailability.newBuilder()
.setTier("tier0")
.setNegated(true)
.build();
BooleanExpression expression = BooleanExpression.newBuilder()
.setHasExternalIp(externalIp)
.build();
validateSingleVmBooleanExpression(expression);
}
@Test
public void externalIpMustHaveTierNameForMultiVm() {
expectIllegalArgumentException(
"Tier attribute must be specified for has_external_ip boolean expression in a multi VM");
BooleanExpression expression = BooleanExpression.newBuilder()
.setHasExternalIp(ExternalIpAvailability.newBuilder().setNegated(true).build())
.build();
validateMultiVmBooleanExpression(expression);
}
@Test
public void gceStartupScriptMustSpecifyNonEmptyContent() {
expectIllegalArgumentException(
"Startup script must specify non-empty script content");
validateStartupScript(
GceStartupScriptSpec.newBuilder().build());
}
@Test
public void validGceStartupScript() {
GceStartupScriptSpec startupSpec = GceStartupScriptSpec.newBuilder()
.setBashScriptContent("echo OK")
.build();
validateStartupScript(startupSpec);
}
@Test
public void validRequiredEmailBoxShouldHaveTestDefaultValue() {
EmailBox emailBox = EmailBox.newBuilder()
.setTestDefaultValue("admin@example.com")
.build();
DeployInputField input = buildRequiredEmailBoxInputField(emailBox);
validateDeployInputFields(
Arrays.asList(input),
new HashSet<String>(),
new HashSet<String>());
}
@Test
public void invalidRequiredEmailBoxShouldHaveTestDefaultValue() {
expectIllegalArgumentException(
"Field 'adminEmailAddress' is required - it should have testDefaultValue");
EmailBox emailBox = EmailBox.newBuilder().build();
DeployInputField input = buildRequiredEmailBoxInputField(emailBox);
validateDeployInputFields(
Arrays.asList(input),
new HashSet<String>(),
new HashSet<String>());
}
private static DeployInputField buildRequiredEmailBoxInputField(EmailBox emailBox) {
return DeployInputField.newBuilder()
.setName("adminEmailAddress")
.setTitle("Administrator email address")
.setRequired(true)
.setEmailBox(emailBox)
.build();
}
@Test
public void externalIpShouldNotFailOnEphemeralDefaultType() {
ExternalIpSpec externalIp = ExternalIpSpec.newBuilder()
.setDefaultType(Type.EPHEMERAL)
.build();
validateExternalIp(externalIp);
}
@Test
public void externalIpShouldNotFailOnNoneDefaultType() {
ExternalIpSpec externalIp = ExternalIpSpec.newBuilder()
.setDefaultType(Type.NONE)
.build();
validateExternalIp(externalIp);
}
@Test
public void externalIpMustNotTakeUnspecifiedValue() {
expectIllegalArgumentException("External IP default type must have a valid type");
ExternalIpSpec externalIp = ExternalIpSpec.newBuilder()
.setDefaultType(Type.TYPE_UNSPECIFIED)
.build();
validateExternalIp(externalIp);
}
@Test
public void stackdriverSpecConnotBeEmpty() {
expectIllegalArgumentException(
"Invalid Stackdriver spec. At least one of logging or monitoring must be specified");
validateStackdriver(StackdriverSpec.getDefaultInstance());
}
@Test
public void networkInterfacesLabelsDoNotFailIfNotExceedMinCountPlus1_singleVm() {
SingleVmDeploymentPackageSpec.Builder builder = newSingleSpecWithDefaults();
builder.getNetworkInterfacesBuilder().setMinCount(2);
builder.getNetworkInterfacesBuilder().addAllLabels(ImmutableList.of("1", "2", "3"));
validate(builder.build());
}
@Test
public void networkInterfacesLabelsMustNotExceedMinCountPlus1_singleVm() {
expectIllegalArgumentException("The number of labels must not exceed min_count + 1.");
SingleVmDeploymentPackageSpec.Builder builder = newSingleSpecWithDefaults();
builder.getNetworkInterfacesBuilder().setMinCount(2);
builder.getNetworkInterfacesBuilder().addAllLabels(ImmutableList.of("1", "2", "3", "4"));
validate(builder.build());
}
@Test
public void networkInterfacesMustHaveMinCountGreaterThan0_singleVm() {
expectIllegalArgumentException("Minimum number of Network interfaces must be greater than 0.");
SingleVmDeploymentPackageSpec.Builder builder = newSingleSpecWithDefaults();
builder.getNetworkInterfacesBuilder().setMinCount(0);
validate(builder.build());
}
@Test
public void networkInterfacesMustNotHaveNegativeMinCount_singleVm() {
expectIllegalArgumentException("Minimum number of Network interfaces must be greater than 0.");
SingleVmDeploymentPackageSpec.Builder builder = newSingleSpecWithDefaults();
builder.getNetworkInterfacesBuilder().setMinCount(-1);
validate(builder.build());
}
@Test
public void networkInterfacesMustNotHaveMaxCountLowerThanMinCount_singleVm() {
expectIllegalArgumentException(
"Maxmium number of Network interfaces must be greater than minimum and at most 8.");
SingleVmDeploymentPackageSpec.Builder builder = newSingleSpecWithDefaults();
builder.getNetworkInterfacesBuilder().setMinCount(2).setMaxCount(1);
validate(builder.build());
}
@Test
public void networkInterfacesMustNotHaveMaxCountGreaterThan8_singleVm() {
expectIllegalArgumentException(
"Maxmium number of Network interfaces must be greater than minimum and at most 8.");
SingleVmDeploymentPackageSpec.Builder builder = newSingleSpecWithDefaults();
builder.getNetworkInterfacesBuilder().setMinCount(2).setMaxCount(9);
validate(builder.build());
}
@Test
public void networkInterfacesDoNotFailWithCorrectMinAndMaxCount_singleVm() {
validate(newSingleSpecWithDefaults().build());
}
@Test
public void networkInterfacesDoNotFailWithCorrectMinAndMaxCountEqual_singleVm() {
SingleVmDeploymentPackageSpec.Builder builder = newSingleSpecWithDefaults();
builder.getNetworkInterfacesBuilder().setMinCount(3).setMaxCount(3);
validate(builder.build());
}
@Test
public void networkInterfacesLabelsMustNotExceedMinCountPlus1_multiVm() {
expectIllegalArgumentException("The number of labels must not exceed min_count + 1.");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1).getNetworkInterfacesBuilder().setMinCount(2);
builder
.getTiersBuilder(1)
.getNetworkInterfacesBuilder()
.addAllLabels(ImmutableList.of("1", "2", "3", "4"));
validate(builder.build());
}
@Test
public void networkInterfacesLabelsDoNotFailIfNotExceedMinCountPlus1_multiVm() {
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1).getNetworkInterfacesBuilder().setMinCount(2);
builder
.getTiersBuilder(1)
.getNetworkInterfacesBuilder()
.addAllLabels(ImmutableList.of("1", "2", "3"));
validate(builder.build());
}
@Test
public void networkInterfacesMustHaveMinCountGreaterThan0_multiVm() {
expectIllegalArgumentException("Minimum number of Network interfaces must be greater than 0.");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1).getNetworkInterfacesBuilder().setMinCount(0);
validate(builder.build());
}
@Test
public void networkInterfacesMustNotHaveNegativeMinCount_multiVm() {
expectIllegalArgumentException("Minimum number of Network interfaces must be greater than 0.");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1).getNetworkInterfacesBuilder().setMinCount(-1);
validate(builder.build());
}
@Test
public void networkInterfacesMustNotHaveMaxCountLowerThanMinCount_multiVm() {
expectIllegalArgumentException(
"Maxmium number of Network interfaces must be greater than minimum and at most 8.");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1).getNetworkInterfacesBuilder().setMinCount(4).setMaxCount(1);
validate(builder.build());
}
@Test
public void networkInterfacesMustNotHaveMaxCountGreaterThan8_multiVm() {
expectIllegalArgumentException(
"Maxmium number of Network interfaces must be greater than minimum and at most 8.");
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1).getNetworkInterfacesBuilder().setMinCount(4).setMaxCount(10);
validate(builder.build());
}
@Test
public void networkInterfacesDoNotFailWithCorrectMinAndMaxCount_multiVm() {
validate(newMultiSpecWithDefaults().build());
}
@Test
public void networkInterfacesDoNotFailWithCorrectMinAndMaxCountEqual_multiVm() {
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpecWithDefaults();
builder.getTiersBuilder(1).getNetworkInterfacesBuilder().setMinCount(1).setMaxCount(1);
validate(builder.build());
}
@Test
public void validateTerraformSpec() {
IllegalArgumentException exception =
Assert.assertThrows(
IllegalArgumentException.class,
() ->
AUTOGEN.generateDeploymentPackage(
invalidTerraformSpecWithApplicationStatusSpec().build(),
Autogen.SharedSupportFilesStrategy.INCLUDED));
assertThat(exception)
.hasMessageThat()
.isEqualTo("Terraform autogen does not support Application Status.");
}
private DeploymentPackageInput.Builder invalidTerraformSpecWithApplicationStatusSpec() {
return DeploymentPackageInput.newBuilder()
.setPartnerId("partner-id")
.setSolutionId("solution-id")
.setSpec(
DeploymentPackageAutogenSpec.newBuilder()
.setSingleVm(newSingleSpecWithApplicationStatus().build())
.setDeploymentTool(DeploymentPackageAutogenSpec.DeploymentTool.TERRAFORM));
}
private void expectIllegalArgumentException(String message) {
thrown.expect(IllegalArgumentException.class);
thrown.expectMessage(message);
}
private void expectIllegalArgumentException(Matcher<String> matcher) {
thrown.expect(IllegalArgumentException.class);
thrown.expectMessage(matcher);
}
private SingleVmDeploymentPackageSpec.Builder newSingleSpec() {
return SingleVmDeploymentPackageSpec.newBuilder()
.addImages(ImageSpec.newBuilder().setProject("image-project").setName("image-name"));
}
private SingleVmDeploymentPackageSpec.Builder newSingleSpecWithDefaults() {
return newSingleSpec()
.setNetworkInterfaces(
NetworkInterfacesSpec.newBuilder()
.setMinCount(2)
.setMaxCount(6)
.setExternalIp(ExternalIpSpec.newBuilder().setDefaultType(Type.EPHEMERAL)))
.setMachineType(
MachineTypeSpec.newBuilder()
.setDefaultMachineType(MachineType.newBuilder().setGceMachineType("e2-standard-2")))
.setBootDisk(
DiskSpec.newBuilder()
.setDiskType(DiskType.newBuilder().setDefaultType("pd-ssd"))
.setDiskSize(DiskSize.newBuilder().setDefaultSizeGb(5))
.setDisplayLabel("Boot disk"))
.addAdditionalDisks(
DiskSpec.newBuilder()
.setDeviceNameSuffix(DeviceName.newBuilder().setName("data-disk"))
.setDiskType(DiskType.newBuilder().setDefaultType("pd-ssd"))
.setDiskSize(DiskSize.newBuilder().setDefaultSizeGb(5))
.setDisplayLabel("Data Disk"));
}
private SingleVmDeploymentPackageSpec.Builder newSingleSpecWithApplicationStatus() {
return newSingleSpec()
.setApplicationStatus(ApplicationStatusSpec.getDefaultInstance())
.setNetworkInterfaces(
NetworkInterfacesSpec.newBuilder()
.setMinCount(2)
.setMaxCount(6)
.setExternalIp(ExternalIpSpec.newBuilder().setDefaultType(Type.EPHEMERAL)))
.setMachineType(
MachineTypeSpec.newBuilder()
.setDefaultMachineType(MachineType.newBuilder().setGceMachineType("e2-standard-2")))
.setBootDisk(
DiskSpec.newBuilder()
.setDiskType(DiskType.newBuilder().setDefaultType("pd-ssd"))
.setDiskSize(DiskSize.newBuilder().setDefaultSizeGb(5))
.setDisplayLabel("Boot disk"))
.addAdditionalDisks(
DiskSpec.newBuilder()
.setDeviceNameSuffix(DeviceName.newBuilder().setName("data-disk"))
.setDiskType(DiskType.newBuilder().setDefaultType("pd-ssd"))
.setDiskSize(DiskSize.newBuilder().setDefaultSizeGb(5))
.setDisplayLabel("Data Disk"));
}
private MultiVmDeploymentPackageSpec.Builder newMultiSpec() {
MultiVmDeploymentPackageSpec.Builder builder = MultiVmDeploymentPackageSpec.newBuilder();
builder
.addTiersBuilder()
.setNetworkInterfaces(
NetworkInterfacesSpec.newBuilder()
.setExternalIp(ExternalIpSpec.newBuilder().setDefaultType(Type.EPHEMERAL)))
.setName("tier0")
.setTitle("Tier 0")
.addImages(ImageSpec.newBuilder().setProject("image-project").setName("image-name-0"));
builder
.addTiersBuilder()
.setNetworkInterfaces(
NetworkInterfacesSpec.newBuilder()
.setMinCount(2)
.setMaxCount(2)
.setExternalIp(ExternalIpSpec.newBuilder().setDefaultType(Type.NONE)))
.setName("tier1")
.setTitle("Tier 1")
.addImages(ImageSpec.newBuilder().setProject("image-project").setName("image-name-1"));
return builder;
}
private MultiVmDeploymentPackageSpec.Builder newMultiSpecWithDefaults() {
MultiVmDeploymentPackageSpec.Builder builder = newMultiSpec();
for (VmTierSpec.Builder tier : builder.getTiersBuilderList()) {
tier.setMachineType(
MachineTypeSpec.newBuilder()
.setDefaultMachineType(
MachineType.newBuilder().setGceMachineType("e2-standard-2")))
.setBootDisk(
DiskSpec.newBuilder()
.setDiskType(DiskSpec.DiskType.newBuilder().setDefaultType("pd-ssd"))
.setDiskSize(DiskSpec.DiskSize.newBuilder().setDefaultSizeGb(5))
.setDisplayLabel("Boot disk"))
.addAdditionalDisks(
DiskSpec.newBuilder()
.setDeviceNameSuffix(DeviceName.newBuilder().setName("data-disk"))
.setDiskType(DiskType.newBuilder().setDefaultType("pd-ssd"))
.setDiskSize(DiskSize.newBuilder().setDefaultSizeGb(5))
.setDisplayLabel("Data Disk"))
.setNetworkInterfaces(
NetworkInterfacesSpec.newBuilder()
.setMinCount(2)
.setMaxCount(6)
.setExternalIp(ExternalIpSpec.newBuilder().setDefaultType(Type.EPHEMERAL)));
}
return builder;
}
private static MachineTypeSpec invalidMachineTypeSpec() {
return MachineTypeSpec.newBuilder().setDefaultMachineType(MachineType.getDefaultInstance()).build();
}
private static MachineTypeSpec validMachineTypeSpec() {
return MachineTypeSpec.newBuilder()
.setDefaultMachineType(MachineType.newBuilder().setGceMachineType("boom-boom-boom"))
.build();
}
private static MachineTypeSpec machineTypeSpecWithNegativeCpu() {
return MachineTypeSpec.newBuilder()
.setDefaultMachineType(MachineType.newBuilder().setGceMachineType("boom-boom-boom"))
.setMinimum(MachineTypeConstraint.newBuilder().setCpu(-1))
.build();
}
private static MachineTypeSpec machineTypeSpecWithNegativeRam() {
return MachineTypeSpec.newBuilder()
.setDefaultMachineType(MachineType.newBuilder().setGceMachineType("boom-boom-boom"))
.setMinimum(MachineTypeConstraint.newBuilder().setRamGb(-1))
.build();
}
private static MachineTypeSpec machineTypeSpecWithEmptyConstraint() {
return MachineTypeSpec.newBuilder()
.setDefaultMachineType(MachineType.newBuilder().setGceMachineType("boom-boom-boom"))
.setMinimum(MachineTypeConstraint.getDefaultInstance())
.build();
}
private static MachineTypeSpec machineTypeSpecWithZeroes() {
return MachineTypeSpec.newBuilder()
.setDefaultMachineType(MachineType.newBuilder().setGceMachineType("boom-boom-boom"))
.setMinimum(MachineTypeConstraint.newBuilder().setCpu(0).setRamGb(0))
.build();
}
private static MachineTypeSpec machineTypeSpecWithValidMinimums() {
return MachineTypeSpec.newBuilder()
.setDefaultMachineType(MachineType.newBuilder().setGceMachineType("boom-boom-boom"))
.setMinimum(MachineTypeConstraint.newBuilder().setCpu(4).setRamGb(8))
.build();
}
private static DiskSpec validBootDiskSpec() {
return DiskSpec.newBuilder()
.setDiskType(DiskSpec.DiskType.newBuilder().setDefaultType("pd-super"))
.setDiskSize(DiskSpec.DiskSize.newBuilder().setDefaultSizeGb(5).setMinSizeGb(5))
.setDisplayLabel("Boot Disk")
.build();
}
private static List<DiskSpec> validAdditionalDisksSpec() {
return Arrays.asList(
DiskSpec.newBuilder()
.setDeviceNameSuffix(DeviceName.newBuilder().setName("disk1"))
.setDiskType(DiskType.newBuilder().setDefaultType("ps-super"))
.setDiskSize(DiskSize.newBuilder().setDefaultSizeGb(3).setMinSizeGb(3))
.setDisplayLabel("Data disk")
.build(),
DiskSpec.newBuilder()
.setDeviceNameSuffix(DeviceName.newBuilder().setName("disk2"))
.setDiskType(DiskSpec.DiskType.newBuilder().setDefaultType("ps-super"))
.setDiskSize(DiskSpec.DiskSize.newBuilder().setDefaultSizeGb(5).setMinSizeGb(2))
.setDisplayLabel("Extra disk")
.build()
);
}
private static FirewallRuleSpec firewallRuleWithoutProtocol() {
return FirewallRuleSpec.newBuilder()
.setPort("8080")
.setAllowedSource(TrafficSource.PUBLIC)
.build();
}
private static FirewallRuleSpec firewallRuleIcmpWithPort() {
return FirewallRuleSpec.newBuilder()
.setProtocol(FirewallRuleSpec.Protocol.ICMP)
.setPort("8080")
.setAllowedSource(TrafficSource.PUBLIC)
.build();
}
private static FirewallRuleSpec firewallRuleWithoutAllowedSource() {
return FirewallRuleSpec.newBuilder()
.setProtocol(FirewallRuleSpec.Protocol.TCP)
.setPort("8080")
.build();
}
private static FirewallRuleSpec validHttpFirewallRule() {
return FirewallRuleSpec.newBuilder()
.setProtocol(FirewallRuleSpec.Protocol.TCP)
.setPort("80")
.setAllowedSource(TrafficSource.PUBLIC)
.build();
}
private static FirewallRuleSpec validHttpsFirewallRule() {
return FirewallRuleSpec.newBuilder()
.setProtocol(FirewallRuleSpec.Protocol.TCP)
.setPort("443")
.setAllowedSource(TrafficSource.PUBLIC)
.build();
}
private static FirewallRuleSpec firewallRuleWithDeploymentSource() {
return FirewallRuleSpec.newBuilder()
.setProtocol(FirewallRuleSpec.Protocol.ICMP)
.setAllowedSource(TrafficSource.DEPLOYMENT)
.build();
}
private static PasswordSpec passwordSpecWithoutMetadataKey() {
return PasswordSpec.newBuilder().setLength(8).build();
}
private static PasswordSpec passwordSpecWithoutLength() {
return PasswordSpec.newBuilder().setMetadataKey("password-key").build();
}
private static PasswordSpec passwordSpecWithoutDisplayLabel() {
return PasswordSpec.newBuilder().setLength(8).setMetadataKey("password-key").build();
}
private static PasswordSpec validPasswordSpec() {
return PasswordSpec.newBuilder()
.setLength(8)
.setMetadataKey("password-key")
.setDisplayLabel("Admin")
.build();
}
private static PasswordSpec validPasswordSpec1() {
return PasswordSpec.newBuilder()
.setLength(8)
.setMetadataKey("password-key-1")
.setDisplayLabel("Admin")
.build();
}
private static PasswordSpec passwordSpecWithBlacklistedMetadataKey() {
return PasswordSpec.newBuilder()
.setLength(8)
.setMetadataKey("startup-script")
.setDisplayLabel("Admin")
.build();
}
private static PasswordSpec passwordSpecWithValidGenerateIfConditionForInput() {
return PasswordSpec.newBuilder(validPasswordSpec())
.setGenerateIf(newValidBooleanDeployInputFieldExpression())
.build();
}
private ImmutableList<PasswordSpec> commonValidPasswordSpecs() {
return ImmutableList.of(
validPasswordSpec(),
validPasswordSpec1(),
passwordSpecWithValidGenerateIfConditionForInput()
);
}
private static PasswordSpec passwordSpecWithValidGenerateIfConditionForExternalIp_single() {
return PasswordSpec.newBuilder(validPasswordSpec())
.setGenerateIf(newBooleanExternalIpExpressionWithoutTierName())
.build();
}
private static PasswordSpec passwordSpecWithValidGenerateIfConditionForExternalIp_multi() {
return PasswordSpec.newBuilder(validPasswordSpec())
.setGenerateIf(newBooleanExternalIpExpressionWithTierName())
.build();
}
private static PasswordSpec passwordSpecWithInvalidGenerateIfConditionForDeployInput() {
return PasswordSpec.newBuilder(validPasswordSpec())
.setGenerateIf(newInvalidBooleanDeployInputFieldExpression())
.build();
}
private static PasswordSpec passwordSpecWithInvalidGenerateIfConditionForExternalIp_single() {
return PasswordSpec.newBuilder(validPasswordSpec())
.setGenerateIf(newBooleanExternalIpExpressionWithTierName())
.build();
}
private static PasswordSpec passwordSpecWithInvalidGenerateIfConditionForExternalIp_multi() {
return PasswordSpec.newBuilder(validPasswordSpec())
.setGenerateIf(newBooleanExternalIpExpressionWithoutTierName())
.build();
}
private static GcpAuthScopeSpec computeGcpAuthScopeSpec() {
return GcpAuthScopeSpec.newBuilder().setScope(GcpAuthScopeSpec.Scope.COMPUTE).build();
}
private static GcpAuthScopeSpec computeReadGcpAuthScopeSpec() {
return GcpAuthScopeSpec.newBuilder()
.setScope(GcpAuthScopeSpec.Scope.COMPUTE_READONLY)
.build();
}
private InstanceUrlSpec validSingleInstanceUrl() {
return InstanceUrlSpec.newBuilder().setScheme(InstanceUrlSpec.Scheme.HTTP).build();
}
private InstanceUrlSpec validMultiInstanceUrl() {
return InstanceUrlSpec.newBuilder()
.setScheme(InstanceUrlSpec.Scheme.HTTP)
.setTierVm(TierVmInstance.newBuilder().setTier("tier0"))
.build();
}
private InstanceUrlSpec multiInstanceUrlWithTierVmButNoTier() {
return InstanceUrlSpec.newBuilder()
.setScheme(InstanceUrlSpec.Scheme.HTTP)
.setTierVm(TierVmInstance.getDefaultInstance())
.build();
}
private ConnectToInstanceSpec validSingleInstanceConnectButton() {
return validSingleInstanceConnectButton("SSH");
}
private ConnectToInstanceSpec validSingleInstanceConnectButton(String displayLabel) {
return ConnectToInstanceSpec.newBuilder()
.setDisplayLabel(displayLabel)
.build();
}
private ConnectToInstanceSpec validMultiInstanceConnectButton() {
return validMultiInstanceConnectButton("SSH");
}
private ConnectToInstanceSpec validMultiInstanceConnectButton(String displayLabel) {
return ConnectToInstanceSpec.newBuilder()
.setTierVm(TierVmInstance.newBuilder().setTier("tier0"))
.setDisplayLabel(displayLabel)
.build();
}
private static BooleanExpression newValidBooleanDeployInputFieldExpression() {
BooleanDeployInputField checkboxReference = BooleanDeployInputField.newBuilder()
.setName("input_someCheckbox")
.build();
return BooleanExpression.newBuilder()
.setBooleanDeployInputField(checkboxReference)
.build();
}
private static BooleanExpression newInvalidBooleanDeployInputFieldExpression() {
//Omit setting the field's name:
BooleanDeployInputField checkboxReference = BooleanDeployInputField.newBuilder().build();
return BooleanExpression.newBuilder()
.setBooleanDeployInputField(checkboxReference)
.build();
}
private static BooleanExpression newBooleanExternalIpExpressionWithTierName() {
ExternalIpAvailability externalIp = ExternalIpAvailability.newBuilder()
.setTier("tier0")
.build();
return BooleanExpression.newBuilder()
.setHasExternalIp(externalIp)
.build();
}
private static BooleanExpression newBooleanExternalIpExpressionWithoutTierName() {
ExternalIpAvailability externalIp = ExternalIpAvailability.newBuilder().build();
return BooleanExpression.newBuilder()
.setHasExternalIp(externalIp)
.build();
}
private PostDeployInfo buildPostDeployInfoWithConnectButton(
ConnectToInstanceSpec button, String deprecatedLabel) {
return PostDeployInfo.newBuilder()
.setConnectButton(button)
.setConnectButtonLabel(deprecatedLabel)
.build();
}
private PostDeployInfo buildPostDeployInfoWithActionItemShowIfNotSpecifyingFieldName() {
PostDeployInfo.ActionItem actionItem =
PostDeployInfo.ActionItem.newBuilder()
.setHeading("Action heading")
.setDescription("Some description")
.setShowIf(newInvalidBooleanDeployInputFieldExpression())
.build();
return PostDeployInfo.newBuilder().addActionItems(actionItem).build();
}
}