View Javadoc
1   /*
2    * Copyright (c) 2016 ingenieux Labs
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package br.com.ingenieux.mojo.beanstalk.env;
18  
19  import com.amazonaws.services.elasticbeanstalk.model.ConfigurationOptionSetting;
20  import com.amazonaws.services.elasticbeanstalk.model.OptionSpecification;
21  
22  import org.apache.maven.plugin.AbstractMojoExecutionException;
23  import org.apache.maven.plugins.annotations.Mojo;
24  import org.apache.maven.plugins.annotations.Parameter;
25  
26  import br.com.ingenieux.mojo.beanstalk.AbstractNeedsEnvironmentMojo;
27  import br.com.ingenieux.mojo.beanstalk.cmd.env.update.UpdateEnvironmentCommand;
28  import br.com.ingenieux.mojo.beanstalk.cmd.env.update.UpdateEnvironmentContext;
29  import br.com.ingenieux.mojo.beanstalk.cmd.env.update.UpdateEnvironmentContextBuilder;
30  
31  /**
32   * Updates the environment versionLabel for a given environmentName <p> See the <a href=
33   * "http://docs.amazonwebservices.com/elasticbeanstalk/latest/api/API_UpdateEnvironment.html"
34   * >UpdateEnvironment API</a> call.
35   *
36   * @since 0.2.0
37   */
38  @Mojo(name = "update-environment")
39  public class UpdateEnvironmentMojo extends AbstractNeedsEnvironmentMojo {
40  
41    /**
42     * Version Label to use
43     */
44    @Parameter(property = "beanstalk.versionLabel")
45    String versionLabel;
46  
47    /**
48     * Application Description
49     */
50    @Parameter(property = "beanstalk.environmentDescription")
51    String environmentDescription;
52  
53    /**
54     * <p> Configuration Option Settings. Will evaluate as such: </p> <p> <p> If empty, will lookup
55     * for beanstalk.env.aws.x.y variable in the context, and it will map this variable to namespace
56     * [aws.x], under option name y, unless there's an alias set. </p> <p> <p> A Property might be
57     * aliased. Current aliases include: </p> <p> <ul> <li>beanstalk.scalingAvailabilityZones, to
58     * aws:autoscaling:asg/Availability Zones</li> <li>beanstalk.scalingCooldown, to
59     * aws:autoscaling:asg/Cooldown</li> <li>beanstalk.scalingCustomAvailabilityZones, to
60     * aws:autoscaling:asg/Custom Availability Zones</li> <li>beanstalk.scalingMinSize, to
61     * aws:autoscaling:asg/MinSize</li> <li>beanstalk.scalingMaxSize, to
62     * aws:autoscaling:asg/MaxSize</li> <li>beanstalk.availabilityZones, to
63     * aws:autoscaling:asg/Custom Availability Zones (SAME AS beanstalk.scalingCustomAvailabilityZones
64     * FOR BACKWARD COMPATIBILITY</li> <p> <li>beanstalk.keyName, to aws:autoscaling:launchconfiguration/EC2KeyName
65     * (EC2 Instance Key)</li> <li>beanstalk.iamInstanceProfile, to aws:autoscaling:launchconfiguration/IamInstanceProfile
66     * (IAM Instance Profile Role Name)</li> <li>beanstalk.imageId, to
67     * aws:autoscaling:launchconfiguration/ImageId</li> <li>beanstalk.instanceType, to
68     * aws:autoscaling:launchconfiguration/InstanceType (EC2 Instance Type to Use)</li>
69     * <li>beanstalk.monitoringInterval, to aws:autoscaling:launchconfiguration/MonitoringInterval</li>
70     * <li>beanstalk.securityGroups, to aws:autoscaling:launchconfiguration/SecurityGroups</li>
71     * <li>beanstalk.sshSourceRestriction, to aws:autoscaling:launchconfiguration/SSHSourceRestriction</li>
72     * <li>beanstalk.blockDeviceMappings, to aws:autoscaling:launchconfiguration/BlockDeviceMappings</li>
73     * <li>beanstalk.rootVolumeType, to aws:autoscaling:launchconfiguration/RootVolumeType</li>
74     * <li>beanstalk.rootVolumeSize, to aws:autoscaling:launchconfiguration/RootVolumeSize</li>
75     * <li>beanstalk.rootVolumeIOPS, to aws:autoscaling:launchconfiguration/RootVolumeIOPS</li> <p>
76     * <li>beanstalk.triggerBreachDuration, to aws:autoscaling:trigger/BreachDuration</li>
77     * <li>beanstalk.triggerLowerBreachScaleIncrement, to aws:autoscaling:trigger/LowerBreachScaleIncrement</li>
78     * <li>beanstalk.triggerLowerThreshold, to aws:autoscaling:trigger/LowerThreshold</li>
79     * <li>beanstalk.triggerMeasureName, to aws:autoscaling:trigger/MeasureName</li>
80     * <li>beanstalk.triggerPeriod, to aws:autoscaling:trigger/Period</li>
81     * <li>beanstalk.triggerStatistic, to aws:autoscaling:trigger/Statistic</li>
82     * <li>beanstalk.triggerUnit, to aws:autoscaling:trigger/Unit</li>
83     * <li>beanstalk.triggerUpperBreachScaleIncrement, to aws:autoscaling:trigger/UpperBreachScaleIncrement</li>
84     * <li>beanstalk.triggerUpperThreshold, to aws:autoscaling:trigger/UpperThreshold</li> <p>
85     * <li>beanstalk.rollingupdateMaxBatchSize, to aws:autoscaling:updatepolicy:rollingupdate/MaxBatchSize</li>
86     * <li>beanstalk.rollingupdateMinInstancesInService, to aws:autoscaling:updatepolicy:rollingupdate/MinInstancesInService</li>
87     * <li>beanstalk.rollingupdatePauseTime, to aws:autoscaling:updatepolicy:rollingupdate/PauseTime</li>
88     * <li>beanstalk.rollingupdateEnabled, to aws:autoscaling:updatepolicy:rollingupdate/RollingUpdateEnabled</li>
89     * <p> <li>beanstalk.vpcId, to aws:ec2:vpc/VPCId</li> <li>beanstalk.vpcSubnets, to
90     * aws:ec2:vpc/Subnets</li> <li>beanstalk.vpcELBSubnets, to aws:ec2:vpc/ELBSubnets</li>
91     * <li>beanstalk.vpcELBScheme, to aws:ec2:vpc/ELBScheme</li> <li>beanstalk.vpcDBSubnets, to
92     * aws:ec2:vpc/DBSubnets</li> <li>beanstalk.vpcAssociatePublicIpAddress, to
93     * aws:ec2:vpc/AssociatePublicIpAddress</li> <p> <li>beanstalk.applicationHealthCheckURL, to
94     * aws:elasticbeanstalk:application/Application Healthcheck URL (Application Healthcheck
95     * URL)</li> <p> <li>beanstalk.timeout, to aws:elasticbeanstalk:command/Timeout</li> <p>
96     * <li>beanstalk.environmentType, to aws:elasticbeanstalk:environment/EnvironmentType
97     * (SingleInstance or ELB-bound Environment)</li> <p> <li>beanstalk.automaticallyTerminateUnhealthyInstances,
98     * to aws:elasticbeanstalk:monitoring/Automatically Terminate Unhealthy Instances (true if
99     * should automatically terminate instances)</li> <p> <li>beanstalk.notificationEndpoint, to
100    * aws:elasticbeanstalk:sns:topics/Notification Endpoint</li> <li>beanstalk.notificationProtocol,
101    * to aws:elasticbeanstalk:sns:topics/Notification Protocol</li> <li>beanstalk.notificationTopicARN,
102    * to aws:elasticbeanstalk:sns:topics/Notification Topic ARN</li> <li>beanstalk.notificationTopicName,
103    * to aws:elasticbeanstalk:sns:topics/Notification Topic Name</li> <p>
104    * <li>beanstalk.sqsdWorkerQueueUrl, to aws:elasticbeanstalk:sqsd/WorkerQueueURL</li>
105    * <li>beanstalk.sqsdHttpPath, to aws:elasticbeanstalk:sqsd/HttpPath</li>
106    * <li>beanstalk.sqsdMimeType, to aws:elasticbeanstalk:sqsd/MimeType</li>
107    * <li>beanstalk.sqsdHttpConnections, to aws:elasticbeanstalk:sqsd/HttpConnections</li>
108    * <li>beanstalk.sqsdConnectTimeout, to aws:elasticbeanstalk:sqsd/ConnectTimeout</li>
109    * <li>beanstalk.sqsdInactivityTimeout, to aws:elasticbeanstalk:sqsd/InactivityTimeout</li>
110    * <li>beanstalk.sqsdVisibilityTimeout, to aws:elasticbeanstalk:sqsd/VisibilityTimeout</li>
111    * <li>beanstalk.sqsdRetentionPeriod, to aws:elasticbeanstalk:sqsd/RetentionPeriod</li>
112    * <li>beanstalk.sqsdMaxRetries, to aws:elasticbeanstalk:sqsd/MaxRetries</li> <p>
113    * <li>beanstalk.healthcheckHealthyThreshold, to aws:elb:healthcheck/HealthyThreshold</li>
114    * <li>beanstalk.healthcheckInterval, to aws:elb:healthcheck/Interval</li>
115    * <li>beanstalk.healthcheckTimeout, to aws:elb:healthcheck/Timeout</li>
116    * <li>beanstalk.healthcheckUnhealthyThreshold, to aws:elb:healthcheck/UnhealthyThreshold</li>
117    * <p> <li>beanstalk.loadBalancerHTTPPort, to aws:elb:loadbalancer/LoadBalancerHTTPPort</li>
118    * <li>beanstalk.loadBalancerPortProtocol, to aws:elb:loadbalancer/LoadBalancerPortProtocol</li>
119    * <li>beanstalk.loadBalancerHTTPSPort, to aws:elb:loadbalancer/LoadBalancerHTTPSPort</li>
120    * <li>beanstalk.loadBalancerSSLPortProtocol, to aws:elb:loadbalancer/LoadBalancerSSLPortProtocol</li>
121    * <li>beanstalk.loadBalancerSSLCertificateId, to aws:elb:loadbalancer/SSLCertificateId</li>
122    * <p> <li>beanstalk.stickinessCookieExpiration, to aws:elb:policies/Stickiness Cookie
123    * Expiration (Stickiness Cookie Expiration Timeout)</li> <li>beanstalk.stickinessPolicy, to
124    * aws:elb:policies/Stickiness Policy (ELB Stickiness Policy)</li> <p>
125    * <li>beanstalk.dbAllocatedStorage, to aws:rds:dbinstance/DBAllocatedStorage</li>
126    * <li>beanstalk.dbDeletionPolicy, to aws:rds:dbinstance/DBDeletionPolicy</li>
127    * <li>beanstalk.dbEngine, to aws:rds:dbinstance/DBEngine</li> <li>beanstalk.dbEngineVersion, to
128    * aws:rds:dbinstance/DBEngineVersion</li> <li>beanstalk.dbInstanceClass, to
129    * aws:rds:dbinstance/DBInstanceClass</li> <li>beanstalk.dbPassword, to
130    * aws:rds:dbinstance/DBPassword</li> <li>beanstalk.dbSnapshotIdentifier, to
131    * aws:rds:dbinstance/DBSnapshotIdentifier</li> <li>beanstalk.dbUser, to
132    * aws:rds:dbinstance/DBUser</li> <li>beanstalk.dbMultiAZDatabase, to
133    * aws:rds:dbinstance/MultiAZDatabase</li> <p> <li>beanstalk.environmentAwsSecretKey, to
134    * aws:elasticbeanstalk:application:environment/AWS_SECRET_KEY</li>
135    * <li>beanstalk.environmentAwsAccessKeyId, to aws:elasticbeanstalk:application:environment/AWS_ACCESS_KEY_ID</li>
136    * <li>beanstalk.environmentJdbcConnectionString, to aws:elasticbeanstalk:application:environment/JDBC_CONNECTION_STRING</li>
137    * <li>beanstalk.environmentParam1, to aws:elasticbeanstalk:application:environment/PARAM1</li>
138    * <li>beanstalk.environmentParam2, to aws:elasticbeanstalk:application:environment/PARAM2</li>
139    * <li>beanstalk.environmentParam3, to aws:elasticbeanstalk:application:environment/PARAM3</li>
140    * <li>beanstalk.environmentParam4, to aws:elasticbeanstalk:application:environment/PARAM4</li>
141    * <li>beanstalk.environmentParam5, to aws:elasticbeanstalk:application:environment/PARAM5</li>
142    * <p> <li>beanstalk.logPublicationControl, to aws:elasticbeanstalk:hostmanager/LogPublicationControl</li>
143    * <p> <li>beanstalk.jvmOptions, to aws:elasticbeanstalk:container:tomcat:jvmoptions/JVM
144    * Options</li> <li>beanstalk.jvmXmx, to aws:elasticbeanstalk:container:tomcat:jvmoptions/Xmx</li>
145    * <li>beanstalk.jvmMaxPermSize, to aws:elasticbeanstalk:container:tomcat:jvmoptions/XX:MaxPermSize</li>
146    * <li>beanstalk.jvmXms, to aws:elasticbeanstalk:container:tomcat:jvmoptions/Xms</li> <p>
147    * <li>beanstalk.phpDocumentRoot, to aws:elasticbeanstalk:container:php:phpini/document_root</li>
148    * <li>beanstalk.phpMemoryLimit, to aws:elasticbeanstalk:container:php:phpini/memory_limit</li>
149    * <li>beanstalk.phpZlibOutputCompression, to aws:elasticbeanstalk:container:php:phpini/zlib.output_compression</li>
150    * <li>beanstalk.phpAllowUrlFopen, to aws:elasticbeanstalk:container:php:phpini/allow_url_fopen</li>
151    * <li>beanstalk.phpDisplayErrors, to aws:elasticbeanstalk:container:php:phpini/display_errors</li>
152    * <li>beanstalk.phpMaxExecutionTime, to aws:elasticbeanstalk:container:php:phpini/max_execution_time</li>
153    * <li>beanstalk.phpComposerOptions, to aws:elasticbeanstalk:container:php:phpini/composer_options</li>
154    * </ul> <p> The reason for most of those aliases if the need to address space and ':' inside
155    * Maven Properties and XML Files.
156    */
157   @Parameter ConfigurationOptionSetting[] optionSettings;
158 
159   @Parameter OptionSpecification[] optionsToRemove;
160 
161   /**
162    * <p> Template Name. </p> <p> <p> Could be either literal or a glob, like, <p>
163    * <pre>
164    * ingenieux-services-prod-*
165    * </pre>
166    * <p> . If a glob, there will be a lookup involved, and the first one in reverse ASCIIbetical
167    * order will be picked upon. </p>
168    */
169   @Parameter(property = "beanstalk.templateName")
170   String templateName;
171 
172   /**
173    * <p>Environment Tier Name (defaults to "WebServer")</p>
174    */
175   @Parameter(property = "beanstalk.environmentTierName", defaultValue = "WebServer")
176   String environmentTierName;
177 
178   /**
179    * <p>Environment Tier Type</p>
180    */
181   @Parameter(property = "beanstalk.environmentTierType")
182   String environmentTierType;
183 
184   /**
185    * <p>Environment Tier Version</p>
186    */
187   @Parameter(property = "beanstalk.environmentTierVersion")
188   String environmentTierVersion;
189 
190   protected Object executeInternal() throws AbstractMojoExecutionException {
191     versionLabel = lookupVersionLabel(applicationName, versionLabel);
192 
193     waitForNotUpdating();
194 
195     if (null == optionSettings) {
196       optionSettings = super.introspectOptionSettings();
197     }
198 
199     UpdateEnvironmentContextBuilder builder =
200         UpdateEnvironmentContextBuilder.updateEnvironmentContext()
201             .withEnvironmentId(curEnv.getEnvironmentId()) //
202             .withEnvironmentDescription(environmentDescription) //
203             .withEnvironmentName(curEnv.getEnvironmentName()) //
204             .withOptionSettings(optionSettings) //
205             .withOptionsToRemove(optionsToRemove) //
206             .withTemplateName(lookupTemplateName(applicationName, templateName)) //
207             .withVersionLabel(versionLabel) //
208             .withEnvironmentTierType(environmentTierType) //
209             .withEnvironmentTierName(environmentTierName) //
210             .withEnvironmentTierVersion(environmentTierVersion) //
211             .withLatestVersionLabel(curEnv.getVersionLabel());
212 
213     UpdateEnvironmentContext context = builder.build();
214     UpdateEnvironmentCommandpdate/UpdateEnvironmentCommand.html#UpdateEnvironmentCommand">UpdateEnvironmentCommand command = new UpdateEnvironmentCommand(this);
215 
216     return command.execute(context);
217   }
218 }