diff --git a/grails-app/conf/BuildConfig.groovy b/grails-app/conf/BuildConfig.groovy index d4d0ac4b..57b47170 100644 --- a/grails-app/conf/BuildConfig.groovy +++ b/grails-app/conf/BuildConfig.groovy @@ -93,12 +93,13 @@ grails.project.dependency.resolution = { compile( // Amazon Web Services programmatic interface. Transitive dependency of glisten, but also used directly. - 'com.amazonaws:aws-java-sdk:1.7.5', + //'com.amazonaws:aws-java-sdk:1.8.11', + 'com.amazonaws:aws-java-sdk:1.10.0', // Enables publication of a health check URL for deploying Asgard, and an on/off switch for activities. // Transitive dependencies include: // rxjava, archaius, ribbon, servo, netflix-commons, netflix-statistics, jersey, guava - 'com.netflix.eureka:eureka-client:1.1.127', + 'com.netflix.eureka:eureka-client:1.3.4', // Transitive dependencies of eureka and aws-java-sdk, but also used for REST calls, e.g., HttpClient 'org.apache.httpcomponents:httpcore:4.2', diff --git a/grails-app/services/com/netflix/asgard/AwsSimpleDbService.groovy b/grails-app/services/com/netflix/asgard/AwsSimpleDbService.groovy index a6a8f2be..4b41ca5c 100644 --- a/grails-app/services/com/netflix/asgard/AwsSimpleDbService.groovy +++ b/grails-app/services/com/netflix/asgard/AwsSimpleDbService.groovy @@ -96,6 +96,8 @@ class AwsSimpleDbService implements InitializingBean { private List runQuery(String domainName, String queryString, Region region) { List appItems = [] + if (!region.simpledb) return appItems + try { appItems = itemRetriever.retrieve(region, new SelectRequest(queryString, true)) } catch (AmazonServiceException ase) { @@ -118,6 +120,8 @@ class AwsSimpleDbService implements InitializingBean { */ void save(String domainName, String itemName, Collection attributes, Region region = Region.defaultRegion()) { + if (!region.simpledb) return + try { awsClient.by(region).putAttributes(new PutAttributesRequest().withDomainName(domainName). withItemName(itemName).withAttributes(attributes)) @@ -143,6 +147,8 @@ class AwsSimpleDbService implements InitializingBean { */ void delete(String domainName, String itemName, List attributes = null, Region region = Region.defaultRegion()) { + if (!region.simpledb) return + try { awsClient.by(region).deleteAttributes(new DeleteAttributesRequest(domainName, itemName, attributes)) @@ -159,6 +165,7 @@ class AwsSimpleDbService implements InitializingBean { List listDomains(Region region) { List domains = [] + if (!region.simpledb) return domains ListDomainsResult result = listDomainsWithToken(region, null) while (true) { diff --git a/grails-app/services/com/netflix/asgard/InstanceTypeService.groovy b/grails-app/services/com/netflix/asgard/InstanceTypeService.groovy index 3c276c2d..69a58cb9 100644 --- a/grails-app/services/com/netflix/asgard/InstanceTypeService.groovy +++ b/grails-app/services/com/netflix/asgard/InstanceTypeService.groovy @@ -145,12 +145,14 @@ class InstanceTypeService implements CacheInitializer { String xxl = 'Double Extra Large' String xxxxl = 'Quadruple Extra Large' String xxxxxxxxl = 'Eight Extra Large' + String decaxl = 'Deca Extra Large' String gen = 'General purpose' String second = 'Second Generation Standard' String cc = 'Cluster Compute' String memOpt = 'Memory optimized' String hiMem = 'High-Memory' String compOpt = 'Compute optimized' + String bInst = 'Burstable Performance Instances' String six4 = '64-bit' String three2OrSix4 = '32-bit or 64-bit' String hcpu = 'High-CPU' @@ -159,6 +161,22 @@ class InstanceTypeService implements CacheInitializer { arch: three2OrSix4, vCpu: '1', ecu: 'Variable', mem: '0.615', storage: 'EBS only', ebsOptim: '-', netPerf: 'Very Low'), + new HardwareProfile(instanceType: 't2.nano', family: bInst, group: gen, size: 'Nano', + arch: six4, vCpu: '1', ecu: 'Variable', mem: '0.5', storage: 'EBS only', ebsOptim: '-', + netPerf: 'Low'), + new HardwareProfile(instanceType: 't2.micro', family: bInst, group: gen, size: 'Micro', + arch: three2OrSix4, vCpu: '1', ecu: 'Variable', mem: '1', storage: 'EBS only', ebsOptim: '-', + netPerf: 'Low to Moderate'), + new HardwareProfile(instanceType: 't2.small', family: bInst, group: gen, size: 'Small', + arch: three2OrSix4, vCpu: '1', ecu: 'Variable', mem: '2', storage: 'EBS only', ebsOptim: '-', + netPerf: 'Low to Moderate'), + new HardwareProfile(instanceType: 't2.medium', family: bInst, group: gen, size: 'Medium', + arch: six4, vCpu: '2', ecu: 'Variable', mem: '4', storage: 'EBS only', ebsOptim: '-', + netPerf: 'Low to Moderate'), + new HardwareProfile(instanceType: 't2.large', family: bInst, group: gen, size: 'Large', + arch: six4, vCpu: '2', ecu: 'Variable', mem: '8', storage: 'EBS only', ebsOptim: '-', + netPerf: 'Low to Moderate'), + new HardwareProfile(instanceType: 'm1.small', family: gen, group: 'Standard', size: 'Small (Default)', arch: three2OrSix4, vCpu: '1', ecu: '1', mem: '1.7', storage: '1 x 160', ebsOptim: '-', netPerf: 'Low'), @@ -180,6 +198,17 @@ class InstanceTypeService implements CacheInitializer { new HardwareProfile(instanceType: 'm3.2xlarge', family: gen, group: second, size: xxl, arch: six4, vCpu: '8', ecu: '26', mem: '30', storage: 'EBS only', ebsOptim: 'Yes', netPerf: 'High'), + new HardwareProfile(instanceType: 'm4.large', family: gen, group: gen, size: 'Large', arch: six4, + vCpu: '2', ecu: '6.5', mem: '8', storage: 'EBS only', ebsOptim: 'Yes', netPerf: 'Moderate'), + new HardwareProfile(instanceType: 'm4.xlarge', family: gen, group: gen, size: xl, arch: six4, + vCpu: '4', ecu: '13', mem: '16', storage: 'EBS only', ebsOptim: 'Yes', netPerf: 'High'), + new HardwareProfile(instanceType: 'm4.2xlarge', family: gen, group: gen, size: xxl, arch: six4, + vCpu: '8', ecu: '26', mem: '32', storage: 'EBS only', ebsOptim: 'Yes', netPerf: 'High'), + new HardwareProfile(instanceType: 'm4.4xlarge', family: gen, group: gen, size: xxxxl, arch: six4, + vCpu: '16', ecu: '53.5', mem: '64', storage: 'EBS only', ebsOptim: 'Yes', netPerf: 'High'), + new HardwareProfile(instanceType: 'm4.10xlarge', family: gen, group: gen, size: decaxl, arch: six4, + vCpu: '40', ecu: '124.5', mem: '160', storage: 'EBS only', ebsOptim: 'Yes', netPerf: '10 Gigabit'), + new HardwareProfile(instanceType: 'c1.medium', family: compOpt, group: hcpu, size: 'Medium', arch: three2OrSix4, vCpu: '2', ecu: '5', mem: '1.7', storage: '1 x 350', ebsOptim: '-', netPerf: 'Moderate'), @@ -193,6 +222,23 @@ class InstanceTypeService implements CacheInitializer { arch: six4, vCpu: '32', ecu: '88', mem: '60.5', storage: '4 x 840', ebsOptim: '-', netPerf: '10 Gigabit'), + new HardwareProfile(instanceType: 'c4.large', family: compOpt, group: hcpu, size: 'Large', + arch: six4, vCpu: '2', ecu: '8', mem: '3.75', storage: 'EBS Only', ebsOptim: 'Yes', + netPerf: 'Moderate'), + new HardwareProfile(instanceType: 'c4.xlarge', family: compOpt, group: hcpu, size: xl, + arch: six4, vCpu: '4', ecu: '16', mem: '7.5', storage: 'EBS Only', ebsOptim: 'Yes', + netPerf: 'High'), + new HardwareProfile(instanceType: 'c4.2xlarge', family: compOpt, group: hcpu, size: xxl, + arch: six4, vCpu: '8', ecu: '31', mem: '15', storage: 'EBS Only', ebsOptim: 'Yes', + netPerf: 'High'), + new HardwareProfile(instanceType: 'c4.4xlarge', family: compOpt, group: hcpu, size: xxxxl, + arch: six4, vCpu: '16', ecu: '62', mem: '30', storage: 'EBS Only', ebsOptim: 'Yes', + netPerf: 'High'), + new HardwareProfile(instanceType: 'c4.8xlarge', family: compOpt, group: hcpu, size: xxxxxxxxl, + arch: six4, vCpu: '36', ecu: '132', mem: '60', storage: 'EBS Only', ebsOptim: 'Yes', + netPerf: '10 Gigabit'), + + // M2 INSTANCE TYPES new HardwareProfile(instanceType: 'm2.xlarge', family: memOpt, group: hiMem, size: xl, arch: six4, vCpu: '2', ecu: '6.5', mem: '17.1', storage: '1 x 420', ebsOptim: '-', netPerf: 'Moderate'), new HardwareProfile(instanceType: 'm2.2xlarge', family: memOpt, group: hiMem, size: xxl, arch: six4, diff --git a/scripts/Codenarc.groovy b/scripts/Codenarc.groovy index ebdd9060..52d952f8 100644 --- a/scripts/Codenarc.groovy +++ b/scripts/Codenarc.groovy @@ -1,220 +1,220 @@ -/* - * Copyright 2012 Netflix, Inc. - * - * 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. - */ -/* This script came from the Grails CodeNarc plugin. We are using just the script so that we can control our dependency - * on the CodeNarc library. - */ -import grails.util.GrailsUtil -import org.apache.tools.ant.BuildException - -// Begin hack to replace CodeNarc 0.19's implementation of loadRuleScriptFile which blows up in recent Groovy. -// Remove this hack after https://github.com/CodeNarc/CodeNarc/pull/26 gets merged and released -// in future CodeNarc version to fix https://github.com/CodeNarc/CodeNarc/issues/25 -import org.codenarc.ruleset.RuleSetUtil -import org.codenarc.util.io.DefaultResourceFactory -import org.codenarc.util.io.ResourceFactory - -ResourceFactory RESOURCE_FACTORY = new DefaultResourceFactory() -RuleSetUtil.metaClass.'static'.loadRuleScriptFile = { String path -> - def inputStream = RESOURCE_FACTORY.getResource(path).inputStream - Class ruleClass - inputStream.withStream { InputStream input -> - GroovyClassLoader gcl = new GroovyClassLoader(getClass().classLoader) - ruleClass = gcl.parseClass(input.text) - } - RuleSetUtil.assertClassImplementsRuleInterface(ruleClass) - ruleClass.newInstance() -} -// End temporary hack for compatibility between CodeNarc 0.19 and Groovy 1.8.* - -includeTargets << grailsScript('_GrailsCompile') - -target('codenarc': 'Run CodeNarc') { - depends(compile) - - runCodenarc() -} - -private void runCodenarc() { - ant.taskdef(name: 'codenarc', classname: 'org.codenarc.ant.CodeNarcTask') - - String configClassName = getBindingValueOrDefault('configClassname', 'BuildConfig') - ConfigObject config = loadConfig(configClassName) - - List reports = getConfiguredReports(config) - - int maxPriority1Violations = getConfigInt(config, 'maxPriority1Violations', Integer.MAX_VALUE) - int maxPriority2Violations = getConfigInt(config, 'maxPriority2Violations', Integer.MAX_VALUE) - int maxPriority3Violations = getConfigInt(config, 'maxPriority3Violations', Integer.MAX_VALUE) - String ruleSetFiles = config.ruleSetFiles ?: - 'rulesets/basic.xml,rulesets/exceptions.xml,rulesets/imports.xml,rulesets/grails.xml,rulesets/unused.xml' - List includes = configureIncludes(config) - boolean systemExitOnBuildException = getConfigBoolean(config, 'systemExitOnBuildException') - - configureCodeNarcPropertiesFile(config) - - println "Running CodeNarc ..." - - try { - ant.codenarc(ruleSetFiles: ruleSetFiles, - maxPriority1Violations: maxPriority1Violations, - maxPriority2Violations: maxPriority2Violations, - maxPriority3Violations: maxPriority3Violations) { - reports.each { r -> - report(type: r.type) { - r.each { key, value -> - if (key != 'type') { - option(name:key, value:value) - } - } - } - } - fileset(dir: '.', includes: includes.join(',')) - } - } - catch (BuildException e) { - if (systemExitOnBuildException) { - println "FAILED -- ${e.message}" - System.exit(1) - } - else { - throw e - } - } - - def reportNames = reports.collect { report -> report.outputFile ?: report.type } - println "CodeNarc finished; report(s) generated: ${reportNames}" -} - -private ConfigObject loadConfig(String className) { - ClassLoader classLoader = Thread.currentThread().contextClassLoader - classLoader.addURL(new File(classesDirPath).toURL()) - - try { - return new ConfigSlurper(GrailsUtil.environment).parse(classLoader.loadClass(className)).codenarc - } - catch (ClassNotFoundException ignored) { - return new ConfigObject() - } -} - -private getBindingValueOrDefault(String varName, Object defaultValue) { - Map variables = binding.variables - variables.containsKey(varName) ? getProperty(varName) : defaultValue -} - -class ReportsDslDelegate { - List reports = [] - def methodMissing(String name, args) { - println "Adding report ${name}" - assert args.size() == 2, "Report [${name}] must specify a report type(String or Class) and a Closure" - assert args[0] instanceof String || args[0] instanceof Class, "Report [${name}] must specify a report type" - assert args[0], "The report definition for [${name}] must specify the report type that is not empty or null" - assert args[1] instanceof Closure, "Report name [${name}] must be followed by a Closure" - def reportClosure = args[1] - def report = new Expando() - report.type = args[0] instanceof String ? args[0] : args[0].name - reportClosure.delegate = report - reportClosure.resolveStrategy = Closure.DELEGATE_FIRST - reportClosure.call() - reports << report.properties - } -} - -private List getConfiguredReports(config) { - if (config.reports) { - assert config.reports instanceof Closure, 'The reports property value must be a Closure' - def closure = config.reports - def delegate = new ReportsDslDelegate() - closure.resolveStrategy = Closure.DELEGATE_FIRST - closure.delegate = delegate - closure.call() - return delegate.reports - } - [] -} - -private void configureCodeNarcPropertiesFile(ConfigObject config) { - final PROPERTIES_FILE_PROP = 'codenarc.properties.file' - if (config.propertiesFile) { - def propValue = "file:${config.propertiesFile}" - System.setProperty(PROPERTIES_FILE_PROP, propValue) - } -} - -private int getConfigInt(config, String name, int defaultIfMissing) { - def value = config[name] - value instanceof Integer ? value : defaultIfMissing -} - -private boolean getConfigBoolean(config, String name, boolean defaultValue = true) { - def value = config[name] - value instanceof Boolean ? value : defaultValue -} - -private List configureIncludes(config) { - List includes = [] - - if (getConfigBoolean(config, 'processSrcGroovy')) { - includes << 'src/groovy/**/*.groovy' - } - - if (getConfigBoolean(config, 'processControllers')) { - includes << 'grails-app/controllers/**/*.groovy' - } - - if (getConfigBoolean(config, 'processDomain')) { - includes << 'grails-app/domain/**/*.groovy' - } - - if (getConfigBoolean(config, 'processServices')) { - includes << 'grails-app/services/**/*.groovy' - } - - if (getConfigBoolean(config, 'processTaglib')) { - includes << 'grails-app/taglib/**/*.groovy' - } - - if (getConfigBoolean(config, 'processUtils')) { - includes << 'grails-app/utils/**/*.groovy' - } - - if (getConfigBoolean(config, 'processTestUnit')) { - includes << 'test/unit/**/*.groovy' - } - - if (getConfigBoolean(config, 'processTestIntegration')) { - includes << 'test/integration/**/*.groovy' - } - - if (getConfigBoolean(config, 'processViews', false)) { - includes << 'grails-app/views/**/*.gsp' - } - - for (includeDir in config.extraIncludeDirs) { - includes << "${includeDir}/**/*.groovy" - } - - includes -} - -try { - // Required for Grails 1.3 and later - setDefaultTarget('codenarc') -} -catch (MissingMethodException ignored) { - // Ignore. Older versions of Groovy/Grails do not implement this method -} - +/* + * Copyright 2012 Netflix, Inc. + * + * 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. + */ +/* This script came from the Grails CodeNarc plugin. We are using just the script so that we can control our dependency + * on the CodeNarc library. + */ +import grails.util.GrailsUtil +import org.apache.tools.ant.BuildException + +// Begin hack to replace CodeNarc 0.19's implementation of loadRuleScriptFile which blows up in recent Groovy. +// Remove this hack after https://github.com/CodeNarc/CodeNarc/pull/26 gets merged and released +// in future CodeNarc version to fix https://github.com/CodeNarc/CodeNarc/issues/25 +import org.codenarc.ruleset.RuleSetUtil +import org.codenarc.util.io.DefaultResourceFactory +import org.codenarc.util.io.ResourceFactory + +ResourceFactory RESOURCE_FACTORY = new DefaultResourceFactory() +RuleSetUtil.metaClass.'static'.loadRuleScriptFile = { String path -> + def inputStream = RESOURCE_FACTORY.getResource(path).inputStream + Class ruleClass + inputStream.withStream { InputStream input -> + GroovyClassLoader gcl = new GroovyClassLoader(getClass().classLoader) + ruleClass = gcl.parseClass(input.text) + } + RuleSetUtil.assertClassImplementsRuleInterface(ruleClass) + ruleClass.newInstance() +} +// End temporary hack for compatibility between CodeNarc 0.19 and Groovy 1.8.* + +includeTargets << grailsScript('_GrailsCompile') + +target('codenarc': 'Run CodeNarc') { + depends(compile) + + runCodenarc() +} + +private void runCodenarc() { + ant.taskdef(name: 'codenarc', classname: 'org.codenarc.ant.CodeNarcTask') + + String configClassName = getBindingValueOrDefault('configClassname', 'BuildConfig') + ConfigObject config = loadConfig(configClassName) + + List reports = getConfiguredReports(config) + + int maxPriority1Violations = getConfigInt(config, 'maxPriority1Violations', Integer.MAX_VALUE) + int maxPriority2Violations = getConfigInt(config, 'maxPriority2Violations', Integer.MAX_VALUE) + int maxPriority3Violations = getConfigInt(config, 'maxPriority3Violations', Integer.MAX_VALUE) + String ruleSetFiles = config.ruleSetFiles ?: + 'rulesets/basic.xml,rulesets/exceptions.xml,rulesets/imports.xml,rulesets/grails.xml,rulesets/unused.xml' + List includes = configureIncludes(config) + boolean systemExitOnBuildException = getConfigBoolean(config, 'systemExitOnBuildException') + + configureCodeNarcPropertiesFile(config) + + println "Running CodeNarc ..." + + try { + ant.codenarc(ruleSetFiles: ruleSetFiles, + maxPriority1Violations: maxPriority1Violations, + maxPriority2Violations: maxPriority2Violations, + maxPriority3Violations: maxPriority3Violations) { + reports.each { r -> + report(type: r.type) { + r.each { key, value -> + if (key != 'type') { + option(name:key, value:value) + } + } + } + } + fileset(dir: '.', includes: includes.join(',')) + } + } + catch (BuildException e) { + if (systemExitOnBuildException) { + println "FAILED -- ${e.message}" + System.exit(1) + } + else { + throw e + } + } + + def reportNames = reports.collect { report -> report.outputFile ?: report.type } + println "CodeNarc finished; report(s) generated: ${reportNames}" +} + +private ConfigObject loadConfig(String className) { + ClassLoader classLoader = Thread.currentThread().contextClassLoader + classLoader.addURL(new File(classesDirPath).toURL()) + + try { + return new ConfigSlurper(GrailsUtil.environment).parse(classLoader.loadClass(className)).codenarc + } + catch (ClassNotFoundException ignored) { + return new ConfigObject() + } +} + +private getBindingValueOrDefault(String varName, Object defaultValue) { + Map variables = binding.variables + variables.containsKey(varName) ? getProperty(varName) : defaultValue +} + +class ReportsDslDelegate { + List reports = [] + def methodMissing(String name, args) { + println "Adding report ${name}" + assert args.size() == 2, "Report [${name}] must specify a report type(String or Class) and a Closure" + assert args[0] instanceof String || args[0] instanceof Class, "Report [${name}] must specify a report type" + assert args[0], "The report definition for [${name}] must specify the report type that is not empty or null" + assert args[1] instanceof Closure, "Report name [${name}] must be followed by a Closure" + def reportClosure = args[1] + def report = new Expando() + report.type = args[0] instanceof String ? args[0] : args[0].name + reportClosure.delegate = report + reportClosure.resolveStrategy = Closure.DELEGATE_FIRST + reportClosure.call() + reports << report.properties + } +} + +private List getConfiguredReports(config) { + if (config.reports) { + assert config.reports instanceof Closure, 'The reports property value must be a Closure' + def closure = config.reports + def delegate = new ReportsDslDelegate() + closure.resolveStrategy = Closure.DELEGATE_FIRST + closure.delegate = delegate + closure.call() + return delegate.reports + } + [] +} + +private void configureCodeNarcPropertiesFile(ConfigObject config) { + final PROPERTIES_FILE_PROP = 'codenarc.properties.file' + if (config.propertiesFile) { + def propValue = "file:${config.propertiesFile}" + System.setProperty(PROPERTIES_FILE_PROP, propValue) + } +} + +private int getConfigInt(config, String name, int defaultIfMissing) { + def value = config[name] + value instanceof Integer ? value : defaultIfMissing +} + +private boolean getConfigBoolean(config, String name, boolean defaultValue = true) { + def value = config[name] + value instanceof Boolean ? value : defaultValue +} + +private List configureIncludes(config) { + List includes = [] + + if (getConfigBoolean(config, 'processSrcGroovy')) { + includes << 'src/groovy/**/*.groovy' + } + + if (getConfigBoolean(config, 'processControllers')) { + includes << 'grails-app/controllers/**/*.groovy' + } + + if (getConfigBoolean(config, 'processDomain')) { + includes << 'grails-app/domain/**/*.groovy' + } + + if (getConfigBoolean(config, 'processServices')) { + includes << 'grails-app/services/**/*.groovy' + } + + if (getConfigBoolean(config, 'processTaglib')) { + includes << 'grails-app/taglib/**/*.groovy' + } + + if (getConfigBoolean(config, 'processUtils')) { + includes << 'grails-app/utils/**/*.groovy' + } + + if (getConfigBoolean(config, 'processTestUnit')) { + includes << 'test/unit/**/*.groovy' + } + + if (getConfigBoolean(config, 'processTestIntegration')) { + includes << 'test/integration/**/*.groovy' + } + + if (getConfigBoolean(config, 'processViews', false)) { + includes << 'grails-app/views/**/*.gsp' + } + + for (includeDir in config.extraIncludeDirs) { + includes << "${includeDir}/**/*.groovy" + } + + includes +} + +try { + // Required for Grails 1.3 and later + setDefaultTarget('codenarc') +} +catch (MissingMethodException ignored) { + // Ignore. Older versions of Groovy/Grails do not implement this method +} + diff --git a/src/groovy/com/netflix/asgard/Region.groovy b/src/groovy/com/netflix/asgard/Region.groovy index 47fed9d8..b5e33e6b 100644 --- a/src/groovy/com/netflix/asgard/Region.groovy +++ b/src/groovy/com/netflix/asgard/Region.groovy @@ -47,6 +47,13 @@ enum Region { 'Ireland' ), + EU_CENTRAL_1('eu-central-1', + 'eu-frankfurt', + 'eu-central-1.gif', + 'Frankfurt', + false + ), + AP_NORTHEAST_1('ap-northeast-1', 'apac-tokyo', 'ap-northeast-1.png', @@ -91,17 +98,23 @@ enum Region { */ String location + /** + * Enable SimpleDB caching + */ + Boolean simpledb + /** * @param code the commonly used code name of the region such as us-east-1 * @param pricingJsonCode the code name of the region used in EC2 pricing json files * @param mapImageFileName the name of the image file to display when the region is selected * @param location the geographical location of the region */ - Region(String code, String pricingJsonCode, mapImageFileName, location) { + Region(String code, String pricingJsonCode, mapImageFileName, location, Boolean simpledb = true) { this.code = code this.pricingJsonCode = pricingJsonCode this.mapImageFileName = mapImageFileName this.location = location + this.simpledb = simpledb } /** diff --git a/src/groovy/com/netflix/asgard/cred/AsgardAWSCredentialsProviderChain.groovy b/src/groovy/com/netflix/asgard/cred/AsgardAWSCredentialsProviderChain.groovy index 5f50d82c..1952891b 100644 --- a/src/groovy/com/netflix/asgard/cred/AsgardAWSCredentialsProviderChain.groovy +++ b/src/groovy/com/netflix/asgard/cred/AsgardAWSCredentialsProviderChain.groovy @@ -62,8 +62,8 @@ class AsgardAWSCredentialsProviderChain extends AWSCredentialsProviderChain { new SshCredentialsProvider(configService), new KeyManagementServiceAssumeRoleCredentialsProvider(configService, restClientService), new KeyManagementServiceCredentialsProvider(configService, restClientService), - new STSAssumeRoleSessionCredentialsProvider(configService.assumeRoleArn, - configService.assumeRoleSessionName), + //new STSAssumeRoleSessionCredentialsProvider.Builder(configService.assumeRoleArn, + // configService.assumeRoleSessionName), new InstanceProfileCredentialsProvider() ] as AWSCredentialsProvider[] ) diff --git a/src/groovy/com/netflix/asgard/model/InstanceType.groovy b/src/groovy/com/netflix/asgard/model/InstanceType.groovy index 79dc78bb..99188187 100644 --- a/src/groovy/com/netflix/asgard/model/InstanceType.groovy +++ b/src/groovy/com/netflix/asgard/model/InstanceType.groovy @@ -18,6 +18,11 @@ package com.netflix.asgard.model enum InstanceType { T1Micro("t1.micro"), + T2Nano("t2.nano"), + T2Micro("t2.micro"), + T2Small("t2.small"), + T2Medium("t2.medium"), + T2Large("t2.large"), M1Small("m1.small"), M1Medium("m1.medium"), M1Large("m1.large"), @@ -27,6 +32,11 @@ enum InstanceType { M3Xlarge("m3.xlarge"), M32xlarge("m3.2xlarge"), M2Xlarge("m2.xlarge"), + M4Large("m4.large"), + M4Xlarge("m4.xlarge"), + M42xlarge("m4.2xlarge"), + M44xlarge("m4.4xlarge"), + M410xlarge("m4.10xlarge"), M22xlarge("m2.2xlarge"), M24xlarge("m2.4xlarge"), Cr18xlarge("cr1.8xlarge"), @@ -43,6 +53,11 @@ enum InstanceType { C32xlarge("c3.2xlarge"), C34xlarge("c3.4xlarge"), C38xlarge("c3.8xlarge"), + C4Large("c4.large"), + C4Xlarge("c4.xlarge"), + C42xlarge("c4.2xlarge"), + C44xlarge("c4.4xlarge"), + C48xlarge("c4.8xlarge"), Cc14xlarge("cc1.4xlarge"), Cc28xlarge("cc2.8xlarge"), G22xlarge("g2.2xlarge"), diff --git a/web-app/images/occasion/halloween/readme.txt b/web-app/images/occasion/halloween/readme.txt index 66a2215f..9f3679ce 100644 --- a/web-app/images/occasion/halloween/readme.txt +++ b/web-app/images/occasion/halloween/readme.txt @@ -1,49 +1,49 @@ -Desktop Halloween Icons - -License Agreement - -By purchasing icons from Aha-Soft, You (the purchaser) agree -to the terms of this agreement, as detailed below. - -You may use the icons from Aha-Soft in commercial and personal -design projects, software or Internet products. Icons can be -displayed in documentation, help files, and advertising materials. -You are free to sell and distribute products and projects using -purchased icons without further royalty fees. - -All icon files are provided 'as is'. Aha-Soft cannot be held -liable for any negative issues that may occur as a result of -using the icons. - -You agree that all ownership and copyright of the icons remains -the property of Aha-Soft. You may not resell, distribute, lease, -license or sub-license the icons or modified icons (or a subset -of the icons), to any third party unless they are incorporated into -your software or design products. - -If you have any questions regarding copyright or licensing, including -whether another license is required for icon use within products, -please contact us here: http://www.aha-soft.com/support.htm - - -Product page: -http://www.desktop-icon.com/stock-icons/desktop-halloween-icons.htm - -Download demo: -http://www.desktop-icon.com/downloads/desktop-halloween-icons.zip -http://www.icon-files.com/downloads/desktop-halloween-icons.zip - -Icon Design Service - -We can design custom icons for you. Please find the basic information -about ordering icons, pricing and the portfolio here: -www.aha-soft.com/icon-design.htm - - -Notice -Web-site standard-icons.com belongs to Aha-Soft. - - -Support page: http://www.aha-soft.com/support.htm - -Copyright � 2000-2010 Aha-Soft. All rights reserved. +Desktop Halloween Icons + +License Agreement + +By purchasing icons from Aha-Soft, You (the purchaser) agree +to the terms of this agreement, as detailed below. + +You may use the icons from Aha-Soft in commercial and personal +design projects, software or Internet products. Icons can be +displayed in documentation, help files, and advertising materials. +You are free to sell and distribute products and projects using +purchased icons without further royalty fees. + +All icon files are provided 'as is'. Aha-Soft cannot be held +liable for any negative issues that may occur as a result of +using the icons. + +You agree that all ownership and copyright of the icons remains +the property of Aha-Soft. You may not resell, distribute, lease, +license or sub-license the icons or modified icons (or a subset +of the icons), to any third party unless they are incorporated into +your software or design products. + +If you have any questions regarding copyright or licensing, including +whether another license is required for icon use within products, +please contact us here: http://www.aha-soft.com/support.htm + + +Product page: +http://www.desktop-icon.com/stock-icons/desktop-halloween-icons.htm + +Download demo: +http://www.desktop-icon.com/downloads/desktop-halloween-icons.zip +http://www.icon-files.com/downloads/desktop-halloween-icons.zip + +Icon Design Service + +We can design custom icons for you. Please find the basic information +about ordering icons, pricing and the portfolio here: +www.aha-soft.com/icon-design.htm + + +Notice +Web-site standard-icons.com belongs to Aha-Soft. + + +Support page: http://www.aha-soft.com/support.htm + +Copyright � 2000-2010 Aha-Soft. All rights reserved. diff --git a/web-app/images/worldmap/eu-central-1.gif b/web-app/images/worldmap/eu-central-1.gif new file mode 100644 index 00000000..f6b7b94b Binary files /dev/null and b/web-app/images/worldmap/eu-central-1.gif differ