def execute(self, parameter_pool):
        eb_client = ElasticBeanstalkClient(
            parameter_pool.get_value(ParameterName.AwsAccessKeyId),
            parameter_pool.get_value(ParameterName.AwsSecretAccessKey),
            parameter_pool.get_value(ParameterName.ServiceEndpoint),
        )

        app_name = parameter_pool.get_value(ParameterName.ApplicationName)
        env_name = parameter_pool.get_value(ParameterName.EnvironmentName)
        prompt.action(DescribeEnvironmentOpMessage.Start.format(env_name))

        response = eb_client.describe_environments(app_name, env_name, include_deleted=u"false")
        log.info(u"Received response for DescribeEnvironemnts call.")
        self._log_api_result(self.__class__.__name__, u"DescribeEnvironments", response.result)

        if len(response.result) > 0:  # If have result
            env_info = response.result[0]
            message = DescribeEnvironmentOpMessage.Result.format(env_info.cname, env_info.status, env_info.health)
            prompt.result(message)
            prompt.info(
                DescribeEnvironmentOpMessage.Detail.format(
                    env_info.environment_name,
                    env_info.environment_id,
                    env_info.solution_stack_name,
                    env_info.version_label,
                    env_info.date_created,
                    env_info.date_updated,
                    env_info.description,
                )
            )

            # If not Green, pull the most recent warning and error events
            if env_info.health in [EnvironmentHealth.Red, EnvironmentHealth.Yellow]:
                events = eb_client.describe_events(
                    app_name,
                    env_name,
                    max_records=ServiceDefault.STATUS_EVENT_MAX_NUM,
                    severity=ServiceDefault.STATUS_EVENT_LEVEL,
                )
                if len(events.result) > 0:
                    # Having one error event
                    for event in events.result:
                        msg = u"{0}\t{1}\t{2}".format(event.event_date, event.severity, event.message)
                        log.info(u"Found last error event: {0}".format(msg))
                        prompt.plain(msg)

            # Display RDS instance host info
            try:
                logical_id, rds_property = rds_utils.retrieve_rds_instance_property(parameter_pool, env_name)
                if rds_property is not None:
                    prompt.result(
                        DescribeEnvironmentOpMessage.RdsInfo.format(
                            logical_id, rds_property.endpoint.address, rds_property.endpoint.port
                        )
                    )
                    prompt.info(
                        DescribeEnvironmentOpMessage.RdsDetail.format(
                            rds_property.engine + u" " + rds_property.engine_version,
                            rds_property.allocated_storage,
                            rds_property.db_instance_class,
                            rds_property.multi_az,
                            rds_property.master_username,
                            rds_property.instance_create_time,
                            rds_property.db_instance_status,
                        )
                    )

            except BaseException as ex:
                log.error(u"Encountered error when retrieve environment resources: {0}.".format(ex))
                raise

        else:
            # No result. Environment not exist.
            message = DescribeEnvironmentOpMessage.NoEnvironment.format(env_name)
            prompt.result(message)

        ret_result = OperationResult(self, response.request_id, message, response.result)
        return ret_result
    def execute(self, parameter_pool):
        eb_client = self._get_eb_client(parameter_pool)
        app_name = parameter_pool.get_value(ParameterName.ApplicationName, False)
        env_name = parameter_pool.get_value(ParameterName.EnvironmentName, False)
        prompt.action(DescribeEnvironmentOpMessage.Start.format(env_name))

        response = eb_client.describe_environments(app_name, env_name, include_deleted="false")
        log.info("Received response for DescribeEnvironemnts call.")
        self._log_api_result(self.__class__.__name__, "DescribeEnvironments", response.result)

        # Also look up environment resources for future use
        resources = None
        try:
            resources = api_wrapper.retrieve_environment_resources(parameter_pool, env_name)
        except InvalidParameterValueException:
            pass

        env_present = (len(response.result) > 0) and bool(resources)

        if env_present:  # If have result
            env_info = response.result[0]

            message = DescribeEnvironmentOpMessage.Result.format(env_info.cname, env_info.status, env_info.health)
            prompt.result(message)

            # Display sqs queue info before environment detail
            if resources.queues:
                for queue in resources.queues:
                    message = DescribeEnvironmentOpMessage.QueueInfo.format(queue.name, queue.url)
                    prompt.result(message)

            tier_serialized = env_info.tier.to_serialized_string() if env_info.tier else ""
            prompt.info(
                DescribeEnvironmentOpMessage.Detail.format(
                    env_info.environment_name,
                    env_info.environment_id,
                    tier_serialized,
                    env_info.solution_stack_name,
                    env_info.version_label,
                    env_info.date_created,
                    env_info.date_updated,
                    env_info.description if env_info.description else "",
                )
            )

            # If not Green, pull the most recent warning and error events
            if env_info.health in [EnvironmentHealth.Red, EnvironmentHealth.Yellow] or (
                env_info.status == EnvironmentStatus.Ready and env_info.health == EnvironmentHealth.Grey
            ):
                events = eb_client.describe_events(
                    app_name,
                    env_name,
                    max_records=ServiceDefault.STATUS_EVENT_MAX_NUM,
                    severity=ServiceDefault.STATUS_EVENT_LEVEL,
                )
                if len(events.result) > 0:
                    # Having one error event
                    for event in events.result:
                        msg = "{0}\t{1}\t{2}".format(event.event_date, event.severity, event.message)
                        log.info("Found last error event: {0}".format(msg))
                        prompt.plain(msg)

            # Display RDS instance host info
            try:
                logical_id, rds_property = rds_utils.retrieve_rds_instance_property(parameter_pool, resources)
                if rds_property is not None:
                    prompt.result(
                        DescribeEnvironmentOpMessage.RdsInfo.format(
                            logical_id, rds_property.endpoint.address, rds_property.endpoint.port
                        )
                    )
                    prompt.info(
                        DescribeEnvironmentOpMessage.RdsDetail.format(
                            rds_property.engine + " " + rds_property.engine_version,
                            rds_property.allocated_storage,
                            rds_property.db_instance_class,
                            rds_property.multi_az,
                            rds_property.master_username,
                            rds_property.instance_create_time,
                            rds_property.db_instance_status,
                        )
                    )

            except BaseException as ex:
                log.error("Encountered error when retrieve environment resources: {0}.".format(ex))
                raise

            # Subcommand
            _, subcommands = parameter_pool.command
            subcommand = subcommands[0].upper() if len(subcommands) > 0 else None
            if subcommand == SubCommandType.OPEN:
                urlpath = ""
                if len(subcommands) > 1:
                    urlpath = subcommands[1] if subcommands[1].startswith("/") else "/" + subcommands[1]
                shell_utils.open_url(env_info.cname + urlpath, False)

        else:
            # No result. Environment not exist.
            message = DescribeEnvironmentOpMessage.NoEnvironment.format(env_name)
            prompt.result(message)

        ret_result = OperationResult(self, response.request_id, message, response.result)
        return ret_result