def _Create(self):
        """Create a Rackspace instance."""
        with tempfile.NamedTemporaryFile(dir=vm_util.GetTempDir(),
                                         prefix='user-data') as tf:
            with open(self.ssh_public_key) as f:
                public_key = f.read().rstrip('\n')

            script = CLOUD_CONFIG_TEMPLATE.format(self.user_name, public_key)
            tf.write(script)
            tf.flush()

            env = os.environ.copy()
            env.update(util.GetDefaultRackspaceNovaEnv(self.zone))
            create_cmd = self._GetCreateCommand()
            create_cmd.extend(
                ['--config-drive', 'true', '--user-data', tf.name, self.name])
            stdout, _, _ = vm_util.IssueCommand(create_cmd, env=env)
            instance = util.ParseNovaTable(stdout)
            if 'id' in instance:
                self.id = instance['id']
            else:
                raise errors.Resource.RetryableCreationError(
                    'There was a problem trying to create instance %s' %
                    self.name)

        if not self._WaitForInstanceUntilActive():
            raise errors.Resource.RetryableCreationError(
                'Failed to create instance')
Ejemplo n.º 2
0
 def _Exists(self):
     """Returns true if the volume exists."""
     nova_env = os.environ.copy()
     nova_env.update(util.GetDefaultRackspaceNovaEnv(self.zone))
     getdisk_cmd = [FLAGS.nova_path, 'volume-show', self.name]
     stdout, _, _ = vm_util.IssueCommand(getdisk_cmd, env=nova_env)
     if stdout.strip() == '':
         return False
     volume = util.ParseNovaTable(stdout)
     return 'status' in volume and volume['status'] == 'available'
 def _Exists(self):
     """Returns true if the VM exists."""
     env = os.environ.copy()
     env.update(util.GetDefaultRackspaceNovaEnv(self.zone))
     getinstance_cmd = [FLAGS.nova_path, 'show', self.id]
     stdout, stderr, _ = vm_util.IssueCommand(getinstance_cmd, env=env)
     if stdout.strip() == '':
         return False
     instance = util.ParseNovaTable(stdout)
     return (instance.get('OS-EXT-STS:task_state') == 'deleting'
             or instance.get('status') == 'ACTIVE')
    def _GetFlavorDetails(self):
        """Retrieves details about the flavor used to build the instance.

    Returns:
      A dict of properties of the flavor used to build the instance.
    """
        env = os.environ.copy()
        env.update(util.GetDefaultRackspaceNovaEnv(self.zone))
        flavor_show_cmd = [FLAGS.nova_path, 'flavor-show', self.machine_type]
        stdout, _, _ = vm_util.IssueCommand(flavor_show_cmd, env=env)
        flavor_properties = util.ParseNovaTable(stdout)
        return flavor_properties
 def _PostCreate(self):
     """Get the instance's data."""
     env = os.environ.copy()
     env.update(util.GetDefaultRackspaceNovaEnv(self.zone))
     getinstance_cmd = [FLAGS.nova_path, 'show', self.id]
     stdout, _, _ = vm_util.IssueCommand(getinstance_cmd, env=env)
     instance = util.ParseNovaTable(stdout)
     if 'status' in instance and instance['status'] == 'ACTIVE':
         self.ip_address = instance['accessIPv4']
         self.ip_address6 = instance['accessIPv6']
         self.internal_ip = instance['private network']
     else:
         raise errors.Error('Unexpected failure.')
Ejemplo n.º 6
0
  def _WaitForInstanceUntilActive(self, max_retries=720, poll_interval_secs=5):
    """Wait until instance achieves non-transient state."""
    env = os.environ.copy()
    env.update(util.GetDefaultRackspaceNovaEnv(self.zone))
    getinstance_cmd = [FLAGS.nova_path, 'show', self.id]

    for _ in xrange(max_retries):
      time.sleep(poll_interval_secs)
      stdout, _, _ = vm_util.IssueCommand(getinstance_cmd, env=env)
      instance = util.ParseNovaTable(stdout)
      if 'status' in instance and instance['status'] != 'BUILD':
        return instance['status'] == 'ACTIVE'

    return False
Ejemplo n.º 7
0
 def _Create(self):
     """Creates the volume."""
     nova_env = os.environ.copy()
     nova_env.update(util.GetDefaultRackspaceNovaEnv(self.zone))
     create_cmd = [
         FLAGS.nova_path, 'volume-create', '--display-name', self.name,
         '--volume-type', DISK_TYPE[self.disk_type],
         str(self.disk_size)
     ]
     stdout, _, _ = vm_util.IssueCommand(create_cmd, env=nova_env)
     volume = util.ParseNovaTable(stdout)
     if 'id' in volume and volume['id']:
         self.id = volume['id']
     else:
         raise errors.Error('There was a problem when creating a volume.')
Ejemplo n.º 8
0
    def _WaitForDiskUntilAttached(self,
                                  vm,
                                  max_retries=30,
                                  poll_interval_secs=5):
        """Wait until volume is attached to the instance."""
        env = os.environ.copy()
        env.update(util.GetDefaultRackspaceNovaEnv(self.zone))
        volume_show_cmd = [FLAGS.nova_path, 'volume-show', self.id]

        for _ in xrange(max_retries):
            stdout, _, _ = vm_util.IssueCommand(volume_show_cmd, env=env)
            volume = util.ParseNovaTable(stdout)
            if 'attachments' in volume and vm.id in volume['attachments']:
                return True
            time.sleep(poll_interval_secs)

        return False
Ejemplo n.º 9
0
    def GetDevicePath(self):
        """Returns the path to the device inside the VM."""
        nova_env = os.environ.copy()
        nova_env.update(util.GetDefaultRackspaceNovaEnv(self.zone))
        getdisk_cmd = [FLAGS.nova_path, 'volume-show', self.name]
        stdout, _, _ = vm_util.IssueCommand(getdisk_cmd, env=nova_env)
        volume = util.ParseNovaTable(stdout)

        attachment_list = []
        if 'attachments' in volume and volume['attachments']:
            attachment_list = json.loads(volume['attachments'])

        if not attachment_list:
            raise errors.Error('Cannot determine volume %s attachments' %
                               self.name)

        for attachment in attachment_list:
            if 'volume_id' in attachment and attachment['volume_id'] == self.id:
                return attachment['device']
        else:
            raise errors.Error(
                'Could not find device path in the volume %s attachments')