diff --git a/README.md b/README.md index 6aae64de..74991639 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ When representing the cost profile for individual resources, Ice will factor the ##Prerequisite: 1. First sign up for Amazon's programmatic billing access [here](http://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/detailed-billing-reports.html) to receive detailed billing(hourly) reports. Verify you receive monthly billing file in the following format: `-aws-billing-detailed-line-items--.csv.zip`. -2. Install Grails 2.2.1 and set GRAILS_HOME and JAVA_HOME +2. Install Grails 2.4.4 and set GRAILS_HOME and JAVA_HOME 3. Ice uses [highstock](http://www.highcharts.com/) to generate interactive graphs. Please make sure you acquire the proper license before using it. @@ -177,15 +177,19 @@ Options with * require writing your own code. 2.1 Set ice.reservationCapacityPoller=true in ice.properties 2.2 Make sure you set up reservation owner accounts in ice.properties. For example: + ice.owneraccount.account1= ice.owneraccount.account2=account3,account4 ice.owneraccount.account5=account6 2.3 If you need to poll reservation capacity of different accounts, set up IAM roles. Then specify the assumed roles and external ids in ice.properties. For example, if assumed role "ice" is used: + ice.owneraccount.account1.role=ice ice.owneraccount.account2.role=ice ice.owneraccount.account5.role=ice + If you use external id too, specify it like following: + ice.owneraccount.account1.externalId= @@ -207,6 +211,7 @@ Options with * require writing your own code. All linked accounts under the same payer account can share each other's reservations (see http://docs.aws.amazon.com/awsaccountbilling/latest/about/AboutConsolidatedBilling.html). If reserved instances are shared among accounts, please specify them in ice.properties. For example: + # set reservation owner accounts. In the example below, account1, account2, account3 and account4 are linked under the same payer account. account5, account6 are linked under the same payer account. # if reservation capacity poller is enabled, the poller will try to poll reservation capacity through ec2 API (desribeReservedInstances) for each reservation owner account. ice.owneraccount.account1_name=account2_name,account3_name,account4_name @@ -230,6 +235,10 @@ Options with * require writing your own code. ice.customTags=tag1,tag2 You will need to ensure that any tag you wish to use in ICE is ticked in the "Manage Cost allocation report" page here: https://portal.aws.amazon.com/gp/aws/developer/account?ie=UTF8&action=cost-allocation-report + + Any tag that you have created yourself (as opposed to being automatically generated by AWS) will require you to use the ice.customTags= parameter in the following way. See this example: + + ice.customTags=user:CostCenter,User:Environment 7. Weekly cost email per application group (*) diff --git a/application.properties b/application.properties index d3de097a..7d041b98 100644 --- a/application.properties +++ b/application.properties @@ -14,7 +14,7 @@ * limitations under the License. */ -app.grails.version=2.2.1 +app.grails.version=2.4.4 app.name=ice app.servlet.version=2.4 app.version=1.1.0 @@ -30,6 +30,3 @@ log4j.category.httpclient=ERROR log4j.category.org.codehaus.groovy=WARN log4j.category.sun.reflect=WARN log4j.rootLogger=INFO, stdout - -plugins.tomcat=2.2.1 - diff --git a/grails-app/conf/BootStrap.groovy b/grails-app/conf/BootStrap.groovy index 44e978bf..79c9b59b 100644 --- a/grails-app/conf/BootStrap.groovy +++ b/grails-app/conf/BootStrap.groovy @@ -198,6 +198,10 @@ class BootStrap { properties.setProperty(IceOptions.CURRENCY_SIGN, prop.getProperty(IceOptions.CURRENCY_SIGN)); if (prop.getProperty(IceOptions.HIGHSTOCK_URL) != null) properties.setProperty(IceOptions.HIGHSTOCK_URL, prop.getProperty(IceOptions.HIGHSTOCK_URL)); + if (prop.getProperty(IceOptions.RESOURCE_GROUP) != null) + properties.setProperty(IceOptions.RESOURCE_GROUP, prop.getProperty(IceOptions.RESOURCE_GROUP)); + if (prop.getProperty(IceOptions.APPLICATION_GROUP) != null) + properties.setProperty(IceOptions.APPLICATION_GROUP, prop.getProperty(IceOptions.APPLICATION_GROUP)); ResourceService resourceService = StringUtils.isEmpty(properties.getProperty(IceOptions.CUSTOM_TAGS)) ? null : new BasicResourceService(); ApplicationGroupService applicationGroupService = new BasicS3ApplicationGroupService(); diff --git a/grails-app/conf/BuildConfig.groovy b/grails-app/conf/BuildConfig.groovy index 79c307b5..6657505a 100644 --- a/grails-app/conf/BuildConfig.groovy +++ b/grails-app/conf/BuildConfig.groovy @@ -22,6 +22,8 @@ grails.project.test.class.dir = 'target/test-classes' grails.project.test.reports.dir = 'target/test-reports' grails.project.war.file = "target/${appName}.war" +grails.project.dependency.resolver = "maven" + grails.project.dependency.resolution = { // inherit Grails' default dependencies inherits("global") { @@ -113,6 +115,7 @@ grails.project.dependency.resolution = { } plugins { - build ":tomcat:$grailsVersion" + //runtime ":hibernate4:4.3.6.1" + build ":tomcat:8.0.20" } } diff --git a/grails-app/controllers/com/netflix/ice/DashboardController.groovy b/grails-app/controllers/com/netflix/ice/DashboardController.groovy index 39488d8b..017032bb 100644 --- a/grails-app/controllers/com/netflix/ice/DashboardController.groovy +++ b/grails-app/controllers/com/netflix/ice/DashboardController.groovy @@ -391,7 +391,23 @@ class DashboardController { return [status: 200, start: 0, data: [:], stats: [:], groupBy: "None"]; } - TagType groupBy = query.getString("groupBy").equals("None") ? null : TagType.valueOf(query.getString("groupBy")); + TagType groupBy = null; + String groupByParam = query.getString("groupBy"); + switch(groupByParam) { + case getConfig().resourceGroup: + groupBy = TagType.valueOf("ResourceGroup"); + break; + case getConfig().applicationGroup: + groupBy = TagType.valueOf("ApplicationGroup"); + break; + case "None": + break; + default: + groupBy = TagType.valueOf(query.getString("groupBy")); + break; + } + + //TagType groupBy = query.getString("groupBy").equals("None") ? null : TagType.valueOf(query.getString("groupBy")); boolean isCost = query.getBoolean("isCost"); boolean breakdown = query.getBoolean("breakdown"); boolean showsps = query.getBoolean("showsps"); @@ -428,7 +444,10 @@ class DashboardController { start = dateFormatter.parseDateTime(query.getString("start")); Interval interval = new Interval(start, end); - interval = tagGroupManager.getOverlapInterval(interval); + Interval overlap_interval = tagGroupManager.getOverlapInterval(interval); + if (overlap_interval != null) { + interval = overlap_interval + } if (interval.getEnd().getMonthOfYear() == new DateTime(DateTimeZone.UTC).getMonthOfYear()) { DateTime curMonth = new DateTime(DateTimeZone.UTC).withDayOfMonth(1).withMillisOfDay(0); int hoursWithData = getManagers().getUsageManager(null, ConsolidateType.hourly).getDataLength(curMonth); diff --git a/grails-app/views/dashboard/appgroup.gsp b/grails-app/views/dashboard/appgroup.gsp index 28efa154..76c23839 100644 --- a/grails-app/views/dashboard/appgroup.gsp +++ b/grails-app/views/dashboard/appgroup.gsp @@ -16,16 +16,18 @@ --%> +<%@ page import="com.netflix.ice.reader.ReaderConfig" %> + <%@ page contentType="text/html;charset=UTF-8" %> - Application Group {{appgroup.name}} + ${ReaderConfig.getInstance().applicationGroup} {{appgroup.name}}
-

Application Group {{appgroup.name}} +

${ReaderConfig.getInstance().applicationGroup} {{appgroup.name}} Edit Application Group

diff --git a/grails-app/views/dashboard/breakdown.gsp b/grails-app/views/dashboard/breakdown.gsp index 6697dea3..6538c759 100644 --- a/grails-app/views/dashboard/breakdown.gsp +++ b/grails-app/views/dashboard/breakdown.gsp @@ -16,6 +16,8 @@ --%> +<%@ page import="com.netflix.ice.reader.ReaderConfig" %> + <%@ page contentType="text/html;charset=UTF-8" %> @@ -89,8 +91,8 @@ - - + + @@ -100,14 +102,14 @@ - - - + diff --git a/grails-app/views/dashboard/editappgroup.gsp b/grails-app/views/dashboard/editappgroup.gsp index 1ff03a8c..43f321ac 100644 --- a/grails-app/views/dashboard/editappgroup.gsp +++ b/grails-app/views/dashboard/editappgroup.gsp @@ -16,23 +16,25 @@ --%> +<%@ page import="com.netflix.ice.reader.ReaderConfig" %> + <%@ page contentType="text/html;charset=UTF-8" %> - Edit Application Group + Edit ${ReaderConfig.getInstance().applicationGroup}
{{message}}
-

CreateEdit Application Group {{appgroup.name}}

+

CreateEdit ${ReaderConfig.getInstance().applicationGroup} {{appgroup.name}}

EditDeleteEditDelete {{groupBy.name}} {{dayFormat(period)}} {{getConsolidateName(data_consolidate)}}
+ Edit + Delete - {{row.name}} + {{row.name}} {{row.name}} diff --git a/grails-app/views/dashboard/detail.gsp b/grails-app/views/dashboard/detail.gsp index ae02f45a..8f9b06b2 100644 --- a/grails-app/views/dashboard/detail.gsp +++ b/grails-app/views/dashboard/detail.gsp @@ -16,6 +16,8 @@ --%> +<%@ page import="com.netflix.ice.reader.ReaderConfig" %> + <%@ page contentType="text/html;charset=UTF-8" %> @@ -31,7 +33,7 @@ Account Region ProductResourceGroup${ReaderConfig.getInstance().resourceGroup} Operation UsageType
- + diff --git a/grails-app/views/layouts/main.gsp b/grails-app/views/layouts/main.gsp index 7e1e094d..f4410394 100644 --- a/grails-app/views/layouts/main.gsp +++ b/grails-app/views/layouts/main.gsp @@ -47,7 +47,7 @@ @@ -60,11 +60,11 @@ @@ -80,6 +80,8 @@ var throughput_factoredCostCurrencySign = '${ReaderConfig.getInstance().throughputMetricService == null ? "" : ReaderConfig.getInstance().throughputMetricService.getFactoredCostCurrencySign()}'; var throughput_factoredCostMultiply = '${ReaderConfig.getInstance().throughputMetricService == null ? "" : ReaderConfig.getInstance().throughputMetricService.getFactoredCostMultiply()}'; var global_currencySign = '${ReaderConfig.getInstance().currencySign}'; + var application_group_name = '${ReaderConfig.getInstance().applicationGroup}'; + var resource_group_name = '${ReaderConfig.getInstance().resourceGroup}'; diff --git a/grailsw b/grailsw index e63626f3..c033fa68 100755 --- a/grailsw +++ b/grailsw @@ -36,6 +36,7 @@ earlyInit # OS specific support (must be 'true' or 'false'). cygwin=false; darwin=false; +mingw=false; case "`uname`" in CYGWIN*) cygwin=true @@ -44,6 +45,10 @@ case "`uname`" in Darwin*) darwin=true ;; + + MINGW*) + mingw=true + ;; esac # Attempt to set JAVA_HOME if it's not already set @@ -74,6 +79,15 @@ if $cygwin ; then CP=`cygpath --path --unix "$CP"` fi +# quick detection of JDK version without JVM startup overhead +CLASSFILE_HEADER_FILE="${JAVA_HOME}/include/classfile_constants.h" +if [ -z "$GRAILS_NO_PERMGEN" -a -f "${CLASSFILE_HEADER_FILE}" ]; then + CLASSFILE_VERSION=`cat "${CLASSFILE_HEADER_FILE}" | grep "#define JVM_CLASSFILE_MAJOR_VERSION" | awk '{ print $3 }' 2> /dev/null` + if [ 0$CLASSFILE_VERSION -ge 52 ]; then + GRAILS_NO_PERMGEN=1 + fi +fi + # Remove possible trailing slash (after possible cygwin correction) GRAILS_HOME=`echo $GRAILS_HOME | sed -e 's|/$||g'` @@ -118,7 +132,7 @@ fi if [ -z "$STARTER_CONF" ]; then STARTER_CONF="$GRAILS_HOME/conf/groovy-starter.conf" fi -STARTER_CLASSPATH="wrapper/grails-wrapper-runtime-2.2.1.jar:wrapper:." +STARTER_CLASSPATH="wrapper/grails-wrapper-runtime-2.4.4.jar:wrapper:." # Allow access to Cocoa classes on OS X if $darwin; then @@ -179,18 +193,24 @@ if $cygwin ; then AGENT_GRAILS_HOME=`cygpath --windows "$GRAILS_HOME"` fi +if $mingw ; then + # Converts GRAILS_HOME path to Windows syntax + [ -n "$GRAILS_HOME" ] && + AGENT_GRAILS_HOME=`cmd //C echo "$GRAILS_HOME"` +fi + if [ -z "$GRAILS_AGENT_CACHE_DIR" ]; then - GRAILS_AGENT_CACHE_DIR=~/.grails/2.2.1/ + GRAILS_AGENT_CACHE_DIR=~/.grails/2.4.4/ fi -SPRINGLOADED_PARAMS=profile=grails;cacheDir=$GRAILS_AGENT_CACHE_DIR +SPRINGLOADED_PARAMS=profile=grails\;cacheDir=$GRAILS_AGENT_CACHE_DIR if [ ! -d "$GRAILS_AGENT_CACHE_DIR" ]; then mkdir -p "$GRAILS_AGENT_CACHE_DIR" fi # Process JVM args -AGENT_STRING="-javaagent:wrapper/springloaded-core-1.1.1.jar -noverify -Dspringloaded=\"$SPRINGLOADED_PARAMS\"" +AGENT_STRING="-javaagent:wrapper/springloaded-1.2.1.RELEASE.jar -Xverify:none -Dspringloaded.synchronize=true -Djdk.reflect.allowGetCallerClass=true -Dspringloaded=$SPRINGLOADED_PARAMS" CMD_LINE_ARGS="" -DISABLE_RELOADING=false +DISABLE_RELOADING=true while true; do if [ "$1" = "-cp" ] || [ "$1" = "-classpath" ]; then @@ -201,6 +221,7 @@ while true; do if [ "$1" = "-reloading" ]; then AGENT=$AGENT_STRING + DISABLE_RELOADING=false shift break fi @@ -263,7 +284,9 @@ if $cygwin; then GRAILS_HOME=`cygpath --path --mixed "$GRAILS_HOME"` JAVA_HOME=`cygpath --path --mixed "$JAVA_HOME"` STARTER_CONF=`cygpath --path --mixed "$STARTER_CONF"` - CP=`cygpath --path --mixed "$CP"` + if [ "x$CP" != "x" ] ; then + CP=`cygpath --path --mixed "$CP"` + fi TOOLS_JAR=`cygpath --path --mixed "$TOOLS_JAR"` STARTER_CLASSPATH=`cygpath --path --mixed "$STARTER_CLASSPATH"` # We build the pattern for arguments to be converted via cygpath @@ -283,7 +306,7 @@ if $cygwin; then for arg in "$@" ; do CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` if [ $CHECK -ne 0 ] ; then - convArg=`cygpath --path --ignore --mixed "$arg"` + convArg=`cygpath --path --ignore --mixed -- "$arg"` else convArg=$arg fi @@ -302,7 +325,10 @@ startGrails() { then GRAILS_OPTS="$GRAILS_OPTS" else - GRAILS_OPTS="-server -Xmx768M -Xms64M -XX:PermSize=32m -XX:MaxPermSize=256m -Dfile.encoding=UTF-8" + GRAILS_OPTS="-server -Xmx768M -Xms64M -Dfile.encoding=UTF-8" + if [ "$GRAILS_NO_PERMGEN" != "1" ]; then + GRAILS_OPTS="$GRAILS_OPTS -XX:PermSize=32m -XX:MaxPermSize=256m" + fi fi JAVA_OPTS="$GRAILS_OPTS $JAVA_OPTS $AGENT" # Start the Profiler or the JVM @@ -314,6 +340,7 @@ startGrails() { -classpath "$STARTER_CLASSPATH" \ -Dgrails.home="$GRAILS_HOME" \ -Dtools.jar="$TOOLS_JAR" \ + -Djava.net.preferIPv4Stack=true \ $STARTER_MAIN_CLASS \ --main $CLASS \ --conf "$STARTER_CONF" \ @@ -323,6 +350,7 @@ startGrails() { -classpath "$STARTER_CLASSPATH" \ -Dgrails.home="$GRAILS_HOME" \ -Dtools.jar="$TOOLS_JAR" \ + -Djava.net.preferIPv4Stack=true \ $STARTER_MAIN_CLASS \ --main $CLASS \ --conf "$STARTER_CONF" \ diff --git a/grailsw.bat b/grailsw.bat index f14a8459..3e5aa5eb 100644 --- a/grailsw.bat +++ b/grailsw.bat @@ -59,14 +59,24 @@ if "%GRAILS_HOME:~-1%"=="\" SET GRAILS_HOME=%GRAILS_HOME:~0,-1% :init -for %%x in ("%HOMEPATH%") do set SHORTHOME=%%~fsx -if "x%GRAILS_AGENT_CACHE_DIR%" == "x" set GRAILS_AGENT_CACHE_DIR=%SHORTHOME%/.grails/2.2.1/ +for %%x in ("%USERPROFILE%") do set SHORTHOME=%%~fsx +if "x%GRAILS_AGENT_CACHE_DIR%" == "x" set GRAILS_AGENT_CACHE_DIR=%SHORTHOME%/.grails/2.4.4/ set SPRINGLOADED_PARAMS="profile=grails;cacheDir=%GRAILS_AGENT_CACHE_DIR%" if not exist "%GRAILS_AGENT_CACHE_DIR%" mkdir "%GRAILS_AGENT_CACHE_DIR%" -set AGENT_STRING=-javaagent:wrapper/springloaded-core-1.1.1.jar -noverify -Dspringloaded=\"%SPRINGLOADED_PARAMS%\" +if "%GRAILS_NO_PERMGEN%" == "" ( + type "%JAVA_HOME%\include\classfile_constants.h" 2>nul | findstr /R /C:"#define JVM_CLASSFILE_MAJOR_VERSION 5[23]" >nul + if not errorlevel 1 set GRAILS_NO_PERMGEN=1 +) + +set AGENT_STRING=-javaagent:wrapper/springloaded-1.2.1.RELEASE.jar -Xverify:none -Dspringloaded.synchronize=true -Djdk.reflect.allowGetCallerClass=true -Dspringloaded=\"%SPRINGLOADED_PARAMS%\" set DISABLE_RELOADING= -if "%GRAILS_OPTS%" == "" set GRAILS_OPTS=-server -Xmx768M -Xms64M -XX:PermSize=32m -XX:MaxPermSize=256m -Dfile.encoding=UTF-8 +if "%GRAILS_OPTS%" == "" ( + set GRAILS_OPTS=-server -Xmx768M -Xms64M -Dfile.encoding=UTF-8 + if not "%GRAILS_NO_PERMGEN%" == "1" ( + set GRAILS_OPTS=-server -Xmx768M -Xms64M -XX:PermSize=32m -XX:MaxPermSize=256m -Dfile.encoding=UTF-8 + ) +) @rem Get command-line arguments, handling Windows variants if "%@eval[2+2]" == "4" goto 4NT_args @@ -80,7 +90,7 @@ set INTERACTIVE=true if "x%~1" == "x" goto execute set CURR_ARG=%~1 if "%CURR_ARG:~0,2%" == "-D" ( - set GRAILS_OPTS=%GRAILS_OPTS% %~1=%~2 + set CMD_LINE_ARGS=%CMD_LINE_ARGS% %~1=%~2 shift shift goto win9xME_args_slurp @@ -130,7 +140,7 @@ set CMD_LINE_ARGS=%$ :execute @rem Setup the command line -set STARTER_CLASSPATH=wrapper/grails-wrapper-runtime-2.2.1.jar;wrapper;. +set STARTER_CLASSPATH=wrapper/grails-wrapper-runtime-2.4.4.jar;wrapper;. if exist "%USERPROFILE%/.groovy/init.bat" call "%USERPROFILE%/.groovy/init.bat" @@ -159,7 +169,7 @@ set JAVA_OPTS=%GRAILS_OPTS% %JAVA_OPTS% %AGENT% set JAVA_OPTS=%JAVA_OPTS% -Dprogram.name="%PROGNAME%" set JAVA_OPTS=%JAVA_OPTS% -Dgrails.home="%GRAILS_HOME%" -set JAVA_OPTS=%JAVA_OPTS% -Dgrails.version=2.2.1 +set JAVA_OPTS=%JAVA_OPTS% -Dgrails.version=2.4.4 set JAVA_OPTS=%JAVA_OPTS% -Dbase.dir=. set JAVA_OPTS=%JAVA_OPTS% -Dtools.jar="%TOOLS_JAR%" set JAVA_OPTS=%JAVA_OPTS% -Dgroovy.starter.conf="%STARTER_CONF%" diff --git a/src/java/com/netflix/ice/basic/BasicReservationService.java b/src/java/com/netflix/ice/basic/BasicReservationService.java index 0525fbe0..7a34ea4d 100644 --- a/src/java/com/netflix/ice/basic/BasicReservationService.java +++ b/src/java/com/netflix/ice/basic/BasicReservationService.java @@ -171,6 +171,9 @@ private void pollAPI() throws Exception { } } UsageType usageType = getUsageType(offer.getInstanceType(), offer.getProductDescription()); + // Unknown Zone + if (Zone.getZone(offer.getAvailabilityZone()) == null) + logger.error("No Zone for " + offer.getAvailabilityZone()); hasNewPrice = setPrice(utilization, currentTime, Zone.getZone(offer.getAvailabilityZone()).region, usageType, offer.getFixedPrice(), hourly) || hasNewPrice; diff --git a/src/java/com/netflix/ice/common/IceOptions.java b/src/java/com/netflix/ice/common/IceOptions.java index e78077c1..2a20f08a 100644 --- a/src/java/com/netflix/ice/common/IceOptions.java +++ b/src/java/com/netflix/ice/common/IceOptions.java @@ -159,4 +159,14 @@ public class IceOptions { * from email to use when test flag is enabled. */ public static final String NUM_WEEKS_FOR_WEEKLYEMAILS = "ice.weeklyCostEmails_numWeeks"; + + /** + * Term to use instead of resource groups. + */ + public static final String RESOURCE_GROUP = "ice.resourceGroup"; + + /** + * Term to use instead of application groups. + */ + public static final String APPLICATION_GROUP = "ice.applicationGroup"; } diff --git a/src/java/com/netflix/ice/reader/ReaderConfig.java b/src/java/com/netflix/ice/reader/ReaderConfig.java index 4c08af76..64405973 100644 --- a/src/java/com/netflix/ice/reader/ReaderConfig.java +++ b/src/java/com/netflix/ice/reader/ReaderConfig.java @@ -42,6 +42,8 @@ public class ReaderConfig extends Config { public final String currencySign; public final double currencyRate; public final String highstockUrl; + public final String resourceGroup; + public final String applicationGroup; public final ApplicationGroupService applicationGroupService; public final ThroughputMetricService throughputMetricService; public final BasicWeeklyCostEmailService costEmailService; @@ -74,6 +76,8 @@ public ReaderConfig( currencySign = properties.getProperty(IceOptions.CURRENCY_SIGN, "$"); currencyRate = Double.parseDouble(properties.getProperty(IceOptions.CURRENCY_RATE, "1")); highstockUrl = properties.getProperty(IceOptions.HIGHSTOCK_URL, "http://code.highcharts.com/stock/highstock.js"); + resourceGroup = properties.getProperty(IceOptions.RESOURCE_GROUP, "Resource Group"); + applicationGroup = properties.getProperty(IceOptions.APPLICATION_GROUP, "Application Group"); this.managers = managers; this.applicationGroupService = applicationGroupService; diff --git a/src/java/com/netflix/ice/tag/Zone.java b/src/java/com/netflix/ice/tag/Zone.java index e6080c62..1eeb5347 100644 --- a/src/java/com/netflix/ice/tag/Zone.java +++ b/src/java/com/netflix/ice/tag/Zone.java @@ -57,6 +57,7 @@ private Zone (Region region, String name) { public static final Zone SA_EAST_1A = new Zone(Region.SA_EAST_1, "sa-east-1a"); public static final Zone SA_EAST_1B = new Zone(Region.SA_EAST_1, "sa-east-1b"); + public static final Zone SA_EAST_1C = new Zone(Region.SA_EAST_1, "sa-east-1c"); public static final Zone AP_NORTHEAST_1A = new Zone(Region.AP_NORTHEAST_1, "ap-northeast-1a"); public static final Zone AP_NORTHEAST_1B = new Zone(Region.AP_NORTHEAST_1, "ap-northeast-1b"); @@ -94,6 +95,7 @@ private Zone (Region region, String name) { zonesByName.put(SA_EAST_1A.name, SA_EAST_1A); zonesByName.put(SA_EAST_1B.name, SA_EAST_1B); + zonesByName.put(SA_EAST_1C.name, SA_EAST_1C); zonesByName.put(AP_NORTHEAST_1A.name, AP_NORTHEAST_1A); zonesByName.put(AP_NORTHEAST_1B.name, AP_NORTHEAST_1B); diff --git a/web-app/WEB-INF/applicationContext.xml b/web-app/WEB-INF/applicationContext.xml index 317410cb..d5921816 100644 --- a/web-app/WEB-INF/applicationContext.xml +++ b/web-app/WEB-INF/applicationContext.xml @@ -26,7 +26,6 @@ http://www.springframework.org/schema/beans http://www.springframework.org/schem Grails application factory bean - @@ -42,21 +41,10 @@ http://www.springframework.org/schema/beans http://www.springframework.org/schem - - - - - - - classpath*:**/grails-app/**/*.groovy - - - utf-8 - \ No newline at end of file + diff --git a/web-app/js/ice.js b/web-app/js/ice.js index f76e6011..40233265 100644 --- a/web-app/js/ice.js +++ b/web-app/js/ice.js @@ -278,6 +278,8 @@ ice.factory('highchart', function() { ice.factory('usage_db', function($window, $http, $filter) { var graphonly = false; + var resourcegroup = resource_group_name; + var applicationgroup = application_group_name; var retrieveNamesIfNotAll = function(array, selected, preselected, filter) { if (!selected && !preselected) @@ -331,6 +333,15 @@ ice.factory('usage_db', function($window, $http, $filter) { graphOnly: function() { return graphonly; }, + + resourceGroup: function() { + return resourcegroup; + }, + + applicationGroup: function() { + return applicationgroup; + }, + addParams: function(params, name, array, selected, preselected, filter) { var selected = retrieveNamesIfNotAll(array, selected, preselected, filter); if (selected) @@ -462,7 +473,7 @@ ice.factory('usage_db', function($window, $http, $filter) { } if (!$scope.showResourceGroups) { for (var j in $scope.groupBys) { - if ($scope.groupBys[j].name === "ResourceGroup") { + if ($scope.groupBys[j].name === resourcegroup) { $scope.groupBys.splice(j, 1); break; } @@ -1012,7 +1023,7 @@ function detailCtrl($scope, $location, $http, usage_db, highchart) { {name: "Account"}, {name: "Region"}, {name: "Product"}, - {name: "ResourceGroup"}, + {name: usage_db.resourceGroup()}, {name: "Operation"}, {name: "UsageType"} ], @@ -1184,7 +1195,7 @@ function appgroupCtrl($scope, $location, $http, usage_db, highchart) { {name: "Account"}, {name: "Region"}, {name: "Product"}, - {name: "ResourceGroup"}, + {name: usage_db.resourceGroup()}, {name: "Operation"}, {name: "UsageType"} ], @@ -1336,7 +1347,7 @@ function breakdownCtrl($scope, $location, $http, usage_db, highchart) { $scope.showResourceGroups = true; $scope.usage_cost = "cost"; - $scope.groupBys = [{name: "ResourceGroup"}, {name: "ApplicationGroup"}]; + $scope.groupBys = [{name: usage_db.resourceGroup()}, {name: usage_db.applicationGroup()}]; $scope.groupBy = $scope.groupBys[0]; $scope.consolidate = "weekly"; $scope.end = new Date(); diff --git a/wrapper/grails-wrapper-runtime-2.2.1.jar b/wrapper/grails-wrapper-runtime-2.2.1.jar deleted file mode 100644 index a70e1c67..00000000 Binary files a/wrapper/grails-wrapper-runtime-2.2.1.jar and /dev/null differ diff --git a/wrapper/grails-wrapper-runtime-2.4.4.jar b/wrapper/grails-wrapper-runtime-2.4.4.jar new file mode 100644 index 00000000..2f605f3d Binary files /dev/null and b/wrapper/grails-wrapper-runtime-2.4.4.jar differ diff --git a/wrapper/springloaded-1.2.1.RELEASE.jar b/wrapper/springloaded-1.2.1.RELEASE.jar new file mode 100644 index 00000000..86b648f0 Binary files /dev/null and b/wrapper/springloaded-1.2.1.RELEASE.jar differ diff --git a/wrapper/springloaded-core-1.1.1.jar b/wrapper/springloaded-core-1.1.1.jar deleted file mode 100644 index f55d3c29..00000000 Binary files a/wrapper/springloaded-core-1.1.1.jar and /dev/null differ
Group Name:Name: