Пример #1
0
    def testGetZonesInRegion(self):
        test_region = 'us-east-1'
        self.enter_context(
            _MockIssueCommand(
                'aws-ec2-describe-availability-zones-output.json'))

        actual_zones = util.GetZonesInRegion(test_region)

        expected_zones = {
            'us-east-1a', 'us-east-1b', 'us-east-1c', 'us-east-1d',
            'us-east-1e', 'us-east-1f'
        }
        self.assertEqual(expected_zones, actual_zones)
 def _GetNewZones(self):
   """Returns a list of zones, excluding the one that the client VM is in."""
   all_zones = util.GetZonesInRegion(self.region)
   for zone in self.zones:
     all_zones.remove(zone)
   return all_zones
  def _Create(self):
    """Creates the AWS CapacaityReservation.

    A reservation will be created given the VM shape in self.vm_groups.
    Count is determined by the number of VMs in said group. The reservation
    will have a lifetime determined by the general PKB concept of
    timeout_minutes. If the reservation exceeds this timeout, AWS will
    cancel it automatically. The VMs in the reservation will not be deleted.
    Note that an empty capacity reservation will encur costs for the
    VM shape / count, even if no VMs are using it.

    After the reservation is created, this method updates all the VMs
    in self.vm_groups by setting the capacity_reservation_id, as well
    as the zone attributes on the VM, and the VM's network instance.

    Raises:
      UnsupportedOsTypeError: If creating a capacity reservation for the
        given os type is not supported.
      CreationError: If a capacity reservation cannot be created in the
        region (typically indicates a stockout).
    """
    if self.os_type in os_types.LINUX_OS_TYPES:
      instance_platform = 'Linux/UNIX'
    elif self.os_type in os_types.WINDOWS_OS_TYPES:
      instance_platform = 'Windows'
    else:
      raise UnsupportedOsTypeError(
          'Unsupported os_type for AWS CapacityReservation: %s.'
          % self.os_type)

    # If the user did not specify an AZ, we need to try to create the
    # CapacityReservation in a specifc AZ until it succeeds.
    # Then update the zone attribute on all the VMs in the group,
    # as well as the zone attribute on the VMs' network instance.
    if util.IsRegion(self.zone_or_region):
      zones_to_try = util.GetZonesInRegion(self.region)
    else:
      zones_to_try = [self.zone_or_region]

    end_date = (
        datetime.datetime.utcnow() +
        datetime.timedelta(minutes=FLAGS.timeout_minutes))
    for zone in zones_to_try:
      cmd = util.AWS_PREFIX + [
          'ec2',
          'create-capacity-reservation',
          '--instance-type=%s' % self.machine_type,
          '--instance-platform=%s' % instance_platform,
          '--availability-zone=%s' % zone,
          '--instance-count=%s' % self.vm_count,
          '--instance-match-criteria=targeted',
          '--region=%s' % self.region,
          '--end-date-type=limited',
          '--end-date=%s' % end_date,
      ]
      stdout, stderr, retcode = vm_util.IssueCommand(cmd)
      if retcode:
        logging.info('Unable to create CapacityReservation in %s. '
                     'This may be retried. Details: %s', zone, stderr)
        continue
      json_output = json.loads(stdout)
      self.capacity_reservation_id = (
          json_output['CapacityReservation']['CapacityReservationId'])
      self._UpdateVmsInGroup(self.capacity_reservation_id, zone)
      return
    raise CreationError('Unable to create CapacityReservation in any of the '
                        'following zones: %s.' % zones_to_try)