Пример #1
0
    def test_saas_server_create(self):
        """Test if we can create a VM using an live endpoint object and shut it down"""

        # This cli command would make a server similar to below
        # dcm-create-server --machineimage 29710 --datacenter 1273 \
        #     --name igable-terminateme --productid t1.micro --budgetid 1512 --description longstring

        self.server = Server(endpoint=self.endpoint)
        self.server.set_from_file("../../secret-test-data/ubuntu-trusty-14.04-amd64-server-20150629.json")

        # override the server name loaded from the json
        self.server.name = "mixcoatl-qa-%s" % str(uuid.uuid4())[:8]
        self.job_id = self.server.launch()

        Job.wait_for(self.job_id, endpoint=self.endpoint)
        self.job = Job(job_id=str(self.job_id), endpoint=self.endpoint)

        self.running_server = Server(self.job.message, endpoint=self.endpoint)
        self.running_server.wait_for(status="RUNNING")

        assert self.server.provider_product_id == self.running_server.provider_product_id
        assert self.server.machine_image["machine_image_id"] == self.running_server.machine_image["machine_image_id"]
        assert self.server.data_center == self.running_server.data_center
        assert self.server.description == self.running_server.description
        assert self.server.name == self.running_server.name
        assert self.server.budget == self.running_server.budget
Пример #2
0
    def test_saas_server_create(self):
        """Test if we can create a VM using an live endpoint object and shut it down"""

        # This cli command would make a server similar to below
        # dcm-create-server --machineimage 29710 --datacenter 1273 \
        #     --name igable-terminateme --productid t1.micro --budgetid 1512 --description longstring

        self.server = Server(endpoint=self.endpoint)
        self.server.set_from_file(
            "../../secret-test-data/ubuntu-trusty-14.04-amd64-server-20150629.json"
        )

        # override the server name loaded from the json
        self.server.name = "mixcoatl-qa-%s" % str(uuid.uuid4())[:8]
        self.job_id = self.server.launch()

        Job.wait_for(self.job_id, endpoint=self.endpoint)
        self.job = Job(job_id=str(self.job_id), endpoint=self.endpoint)

        self.running_server = Server(self.job.message, endpoint=self.endpoint)
        self.running_server.wait_for(status='RUNNING')

        assert self.server.provider_product_id == self.running_server.provider_product_id
        assert self.server.machine_image[
            'machine_image_id'] == self.running_server.machine_image[
                'machine_image_id']
        assert self.server.data_center == self.running_server.data_center
        assert self.server.description == self.running_server.description
        assert self.server.name == self.running_server.name
        assert self.server.budget == self.running_server.budget
Пример #3
0
    def create(self, callback=None):
        """Creates a new volume

        :param callback: Optional callback to send the resulting :class:`Job`
        :type callback: func.
        :returns: :class:`Job`
        :raises: :class:`VolumeCreationException`
        """
        optional_attrs = ['label']
        if self.volume_id is not None:
            raise VolumeCreationException(
                'Cannot create an already created volume: %s' % self.volume_id)

        parms = {'name': self.name, 'description': self.description, 'data_center': self.data_center,
                 'size_in_gb': self.size_in_gb, 'budget': self.budget}

        for oa in optional_attrs:
            try:
                if getattr(self, oa) is not None:
                    parms[0].update({oa: getattr(self, oa)})
            except AttributeError:
                pass

        payload = {'addVolume': [camel_keys(parms)]}
        self.post(data=json.dumps(payload))
        if self.last_error is None:
            j = Job(self.current_job, endpoint=self.endpoint)
            j.load()
            if callback is not None:
                callback(j)
            else:
                return j
        else:
            raise VolumeCreationException(self.last_error)
Пример #4
0
 def reload(self):
     """Reload resource data from API calls"""
     if self.relational_database_id is not None:
         self.load()
     elif self.current_job is None:
         self.load()
     else:
         if Job.wait_for(self.current_job):
             job = Job(self.current_job)
             self.__relational_database_id = job.message
             self.load()
         else:
             return self.last_error
Пример #5
0
 def reload(self):
     """Reload resource data from API calls"""
     if self.storage_object_id is not None:
         self.load()
     elif self.current_job is None:
         self.load()
     else:
         if Job.wait_for(self.current_job):
             job = Job(self.current_job)
             self.__storage_object_id = job.message
             self.load()
         else:
             return self.last_error
Пример #6
0
 def reload(self):
     """Reload resource data from API calls"""
     if self.server_id is not None:
         self.load()
     elif self.current_job is None:
         self.load()
     else:
         if Job.wait_for(self.current_job):
             job = Job(self.current_job, endpoint=self.endpoint)
             self.__server_id = job.message
             self.load()
         else:
             return self.last_error
Пример #7
0
    def add_snapshot(cls,
                     volume_id,
                     name,
                     description,
                     budget,
                     callback=None,
                     endpoint=None):
        """Creates a snapshot from `volume_id`

            .. warning::

                Snapshot creation is an asynchronous task.
                Specifying a callback will cause a blocking operation while the snapshot completes.
                When using the callback, execution could block for a **VERY** long time depending on the time it takes to make the snapshot.

        :param volume_id: The volume to snapshot
        :type volume_id: int.
        :param name: The name for the snapshot
        :type name: str.
        :param description: Description of the snapshot
        :type description: str.
        :param budget: The billing code for the snapshot
        :type budget: int.
        :param callback: An optional callback to send the final :class:`Snapshot`.
        :type callback: func.
        :returns: :class:`Snapshot`
        :raises: :class:`SnapshotException`
        """

        s = cls()
        s.volume = volume_id
        s.name = name
        s.budget = budget
        s.description = description
        s.create()
        if s.current_job is None:
            raise SnapshotException('No job found. This is...odd')
        else:
            if callback is not None:
                job = Job.wait_for(s.current_job)
                if job is True:
                    try:
                        j = Job(s.current_job, endpoint=endpoint)
                        snapshot = cls(j.message)
                        snapshot.load()
                        callback(snapshot)
                    except:
                        raise SnapshotException("Unhandled error in callback")
            else:
                return s
Пример #8
0
def watch_jobs():
	job_averages = []
	print("Processing jobs... Please hold.")
	job_table = PrettyTable(["ID", "Status", "Description", "Minutes to Complete"])

	while len(jobs) > 0:
		for i in jobs:
			if Job.wait_for(i) == True:
				the_job = Job(i)
				start = datetime.strptime(the_job.start_date.split("+")[0], '%Y-%m-%dT%H:%M:%S.%f')
				end = datetime.strptime(the_job.end_date.split("+")[0], '%Y-%m-%dT%H:%M:%S.%f')
				min_to_comp = (end - start).seconds
				job_averages.append(min_to_comp)
				job_table.add_row([the_job.job_id, the_job.status, the_job.description, round((min_to_comp/60),3)])

				if 'Launch Server' in the_job.description:
					servers_launched.append(int(the_job.message))
				elif 'CREATE VOLUME' in the_job.description:
					volumes_created.append(int(the_job.message))
				elif 'Snapshot of' in the_job.description:
					snapshots_created.append(int(the_job.message))
				elif 'Create Image' in the_job.description:
					images_created.append(int(the_job.message))

				jobs.remove(i)

	#print "Averages:",job_averages
	average = round((sum(job_averages)/60)/len(job_averages),3)
	averages.append(average)
	job_table.add_row(["--","--","--",average])

	print job_table
Пример #9
0
    def create(self, **kwargs):
        """Create a new network

        :param callback: Optional callback to call with resulting :class:`Network`
        :type callback: func.
        :returns: :class:`Job`
        :raises: :class:`NetworkException`
        """

        optional_attrs = [
            'owning_groups', 'ntp_servers', 'dns_servers', 'label'
        ]
        payload = {
            'add_network': [{
                'budget': self.budget,
                'name': self.name,
                'network_address': self.network_address,
                'description': self.description,
                'region': self.region
            }]
        }

        if 'label' in kwargs:
            payload['add_network'][0]['label'] = kwargs['label']

        callback = kwargs.get('callback', None)

        for oa in optional_attrs:
            try:
                if getattr(self, oa) is not None:
                    payload['add_network'][0].update({oa: getattr(self, oa)})
            except AttributeError:
                pass

        self.post(self.PATH, data=json.dumps(camel_keys(payload)))

        if self.last_error is None:
            j = Job(self.current_job, endpoint=self.endpoint)
            j.load()
            if callback is not None:
                callback(j)
            else:
                return j
        else:
            raise NetworkException(self.last_error)
Пример #10
0
    def create(self, **kwargs):
        """Create a new network

        :param callback: Optional callback to call with resulting :class:`Network`
        :type callback: func.
        :returns: :class:`Job`
        :raises: :class:`NetworkException`
        """

        optional_attrs = [
            'owning_groups', 'ntp_servers', 'dns_servers', 'label']
        payload = {'add_network': [{
                   'budget': self.budget,
                   'name': self.name,
                   'network_address': self.network_address,
                   'description': self.description,
                   'region': self.region}]}

        if 'label' in kwargs:
            payload['add_network'][0]['label'] = kwargs['label']

        callback = kwargs.get('callback', None)

        for oa in optional_attrs:
            try:
                if getattr(self, oa) is not None:
                    payload['add_network'][0].update({oa: getattr(self, oa)})
            except AttributeError:
                pass

        self.post(self.PATH, data=json.dumps(camel_keys(payload)))

        if self.last_error is None:
            j = Job(self.current_job)
            j.load()
            if callback is not None:
                callback(j)
            else:
                return j
        else:
            raise NetworkException(self.last_error)
Пример #11
0
    def test_volume_creation(self):
        """Test the creating of a dummy volume against a live endpoint"""

        # This command would create a volume similar to below
        # dcm-create-volume --budgetid 1512 --datacenter 1273 --size 1 --name mixcoatl-qa --description junk

        self.volume = Volume(endpoint=self.endpoint)
        self.volume.set_from_file("../../secret-test-data/vagrant-volume.json")
        self.volume.name = "mixcoatl-qa-%s" % str(uuid.uuid4())[:8]
        self.job = self.volume.create()
        Job.wait_for(self.job.job_id, endpoint=self.endpoint)

        # force reload of job attributed from DCM API
        self.job.load()
        self.live_volume = Volume(volume_id=self.job.message, endpoint=self.endpoint)

        assert self.volume.data_center == self.live_volume.data_center
        assert self.volume.budget == self.live_volume.budget
        assert self.volume.size_in_gb == self.live_volume.size_in_gb
        assert self.volume.description == self.live_volume.description
        assert self.volume.name == self.live_volume.name
Пример #12
0
    def create(self, **kwargs):
        """Create a new firewall

        :param label: Optional label to assign the firewall
        :type label: str.
        :param callback: Optional callback to call with resulting :class:`Firewall`
        :type callback: func.
        :returns: :class:`Firewall`
        :raises: :class:`FirewallException`
        """

        payload = {
            'add_firewall': [{
                'budget': self.budget,
                'region': self.region,
                'name': self.name,
                'description': self.description
            }]
        }

        if 'label' in kwargs:
            payload['add_firewall'][0]['label'] = kwargs['label']

        callback = kwargs.get('callback', None)

        self.post(self.PATH, data=json.dumps(camel_keys(payload)))

        if self.last_error is None:
            if callback is None:
                return self
            else:
                if Job.wait_for(self.current_job) is True:
                    j = Job(self.current_job, endpoint=self.endpoint)
                    self.__firewall_id = j.message
                    self.load()
                    return self
                else:
                    raise FirewallException(j.last_error)
        else:
            raise FirewallException(self.last_error)
Пример #13
0
 def reload(self):
     """Reload resource data from API calls"""
     if self.server_id is not None:
         self.load()
     elif self.current_job is None:
         self.load()
     else:
         if Job.wait_for(self.current_job):
             job = Job(self.current_job)
             self.__server_id = job.message
             self.load()
         else:
             return self.last_error
Пример #14
0
 def reload(self):
     """Reload resource data from API calls"""
     if self.product_id is not None:
         self.load()
     elif self.current_job is None:
         self.load()
     else:
         if Job.wait_for(self.current_job):
             job = Job(self.current_job)
             self.__relational_database_id = job.message
             self.load()
         else:
             return self.last_error
Пример #15
0
    def test_volume_creation(self):
        """Test the creating of a dummy volume against a live endpoint"""

        # This command would create a volume similar to below
        # dcm-create-volume --budgetid 1512 --datacenter 1273 --size 1 --name mixcoatl-qa --description junk

        self.volume = Volume(endpoint=self.endpoint)
        self.volume.set_from_file("../../secret-test-data/vagrant-volume.json")
        self.volume.name = "mixcoatl-qa-%s" % str(uuid.uuid4())[:8]
        self.job = self.volume.create()
        Job.wait_for(self.job.job_id, endpoint=self.endpoint)

        # force reload of job attributed from DCM API
        self.job.load()
        self.live_volume = Volume(volume_id=self.job.message,
                                  endpoint=self.endpoint)

        assert self.volume.data_center == self.live_volume.data_center
        assert self.volume.budget == self.live_volume.budget
        assert self.volume.size_in_gb == self.live_volume.size_in_gb
        assert self.volume.description == self.live_volume.description
        assert self.volume.name == self.live_volume.name
Пример #16
0
    def add_snapshot(cls, volume_id, name, description, budget, callback=None):
        """Creates a snapshot from `volume_id`

            .. warning::

                Snapshot creation is an asynchronous task.
                Specifying a callback will cause a blocking operation while the snapshot completes.
                When using the callback, execution could block for a **VERY** long time depending on the time it takes to make the snapshot.

        :param volume_id: The volume to snapshot
        :type volume_id: int.
        :param name: The name for the snapshot
        :type name: str.
        :param description: Description of the snapshot
        :type description: str.
        :param budget: The billing code for the snapshot
        :type budget: int.
        :param callback: An optional callback to send the final :class:`Snapshot`.
        :type callback: func.
        :returns: :class:`Snapshot`
        :raises: :class:`SnapshotException`
        """

        s = cls()
        s.volume = volume_id
        s.name = name
        s.budget = budget
        s.description = description
        s.create()
        if s.current_job is None:
            raise SnapshotException('No job found. This is...odd')
        else:
            if callback is not None:
                job = Job.wait_for(s.current_job)
                if job is True:
                    try:
                        j = Job(s.current_job)
                        snapshot = cls(j.message)
                        snapshot.load()
                        callback(snapshot)
                    except:
                        raise SnapshotException("Unhandled error in callback")
            else:
                return s
Пример #17
0
    def create(self, **kwargs):
        """Create a new firewall

        :param label: Optional label to assign the firewall
        :type label: str.
        :param callback: Optional callback to call with resulting :class:`Firewall`
        :type callback: func.
        :returns: :class:`Firewall`
        :raises: :class:`FirewallException`
        """

        payload = {'add_firewall': [{
            'budget': self.budget,
            'region': self.region,
            'name': self.name,
            'description': self.description
        }]}

        if 'label' in kwargs:
            payload['add_firewall'][0]['label'] = kwargs['label']

        callback = kwargs.get('callback', None)

        self.post(self.PATH, data=json.dumps(camel_keys(payload)))

        if self.last_error is None:
            if callback is None:
                return self
            else:
                if Job.wait_for(self.current_job) is True:
                    j = Job(self.current_job, endpoint=self.endpoint)
                    self.__firewall_id = j.message
                    self.load()
                    return self
                else:
                    raise FirewallException(j.last_error)
        else:
            raise FirewallException(self.last_error)