Module tests.digitalocean

Classes

class digitalocean
Expand source code
class digitalocean(cloudprovider):
    DO_API_TOKEN = os.getenv("ENV_DO_API_TOKEN")
    DO_API_URL_BASE = "https://api.digitalocean.com/v2/"
    DO_NODE_TAG = "longhorn-tests"
    DO_REQ_HEADERS = {'Content-Type': 'application/json',
                      'Authorization': 'Bearer {0}'.format(DO_API_TOKEN)}
    DO_API_TIMEOUT_SEC = 120

    def is_api_token_defined(self):
        if self.DO_API_TOKEN is None or self.DO_API_TOKEN == "":
            print("Err: ENV_DO_API_TOKEN is not defined")
            return False
        else:
            return True

    def node_id(self, node_name):
        assert self.is_api_token_defined()

        api_url = '{0}droplets'.format(self.DO_API_URL_BASE)

        payload = {'tag_name': self.DO_NODE_TAG}

        do_api_response = \
            requests.get(api_url, params=payload, headers=self.DO_REQ_HEADERS)

        do_nodes = do_api_response.json()

        for do_droplet in do_nodes['droplets']:
            if do_droplet['name'] == node_name:
                return do_droplet['id']

    def node_status(self, node_id):
        assert self.is_api_token_defined()

        api_url = '{0}droplets'.format(self.DO_API_URL_BASE)

        payload = {'tag_name': self.DO_NODE_TAG}

        do_api_response = requests.get(api_url,
                                       params=payload,
                                       headers=self.DO_REQ_HEADERS)

        do_nodes = do_api_response.json()

        for do_droplet in do_nodes['droplets']:
            if do_droplet['id'] == node_id:
                return do_droplet['status']

    def droplet_exec_action(self,
                            droplet_id,
                            action,
                            expected_status,
                            desired_status):
        assert self.is_api_token_defined()

        api_url = '{0}droplets/{1}/actions'.format(self.DO_API_URL_BASE,
                                                   droplet_id)

        payload = {'type': action}

        droplet_current_status = self.node_status(droplet_id)

        if droplet_current_status == expected_status:
            requests.post(api_url, headers=self.DO_REQ_HEADERS, json=payload)

            action_ok = False
            for i in range(self.DO_API_TIMEOUT_SEC):
                droplet_status = self.node_status(droplet_id)
                if droplet_status == desired_status:
                    action_ok = True
                    break
                elif droplet_status == expected_status:
                    time.sleep(1)

            return action_ok

        elif droplet_current_status == desired_status:
            return True

    def node_start(self, node_id):
        self.droplet_exec_action(droplet_id=node_id,
                                 action="power_on",
                                 expected_status="off",
                                 desired_status="active")

    def node_shutdown(self, node_id):
        self.droplet_exec_action(droplet_id=node_id,
                                 action="shutdown",
                                 expected_status="active",
                                 desired_status="off")

Ancestors

  • cloudprovider.cloudprovider

Class variables

var DO_API_TIMEOUT_SEC

The type of the None singleton.

var DO_API_TOKEN

The type of the None singleton.

var DO_API_URL_BASE

The type of the None singleton.

var DO_NODE_TAG

The type of the None singleton.

var DO_REQ_HEADERS

The type of the None singleton.

Methods

def droplet_exec_action(self, droplet_id, action, expected_status, desired_status)
Expand source code
def droplet_exec_action(self,
                        droplet_id,
                        action,
                        expected_status,
                        desired_status):
    assert self.is_api_token_defined()

    api_url = '{0}droplets/{1}/actions'.format(self.DO_API_URL_BASE,
                                               droplet_id)

    payload = {'type': action}

    droplet_current_status = self.node_status(droplet_id)

    if droplet_current_status == expected_status:
        requests.post(api_url, headers=self.DO_REQ_HEADERS, json=payload)

        action_ok = False
        for i in range(self.DO_API_TIMEOUT_SEC):
            droplet_status = self.node_status(droplet_id)
            if droplet_status == desired_status:
                action_ok = True
                break
            elif droplet_status == expected_status:
                time.sleep(1)

        return action_ok

    elif droplet_current_status == desired_status:
        return True
def is_api_token_defined(self)
Expand source code
def is_api_token_defined(self):
    if self.DO_API_TOKEN is None or self.DO_API_TOKEN == "":
        print("Err: ENV_DO_API_TOKEN is not defined")
        return False
    else:
        return True
def node_id(self, node_name)
Expand source code
def node_id(self, node_name):
    assert self.is_api_token_defined()

    api_url = '{0}droplets'.format(self.DO_API_URL_BASE)

    payload = {'tag_name': self.DO_NODE_TAG}

    do_api_response = \
        requests.get(api_url, params=payload, headers=self.DO_REQ_HEADERS)

    do_nodes = do_api_response.json()

    for do_droplet in do_nodes['droplets']:
        if do_droplet['name'] == node_name:
            return do_droplet['id']
def node_shutdown(self, node_id)
Expand source code
def node_shutdown(self, node_id):
    self.droplet_exec_action(droplet_id=node_id,
                             action="shutdown",
                             expected_status="active",
                             desired_status="off")
def node_start(self, node_id)
Expand source code
def node_start(self, node_id):
    self.droplet_exec_action(droplet_id=node_id,
                             action="power_on",
                             expected_status="off",
                             desired_status="active")
def node_status(self, node_id)
Expand source code
def node_status(self, node_id):
    assert self.is_api_token_defined()

    api_url = '{0}droplets'.format(self.DO_API_URL_BASE)

    payload = {'tag_name': self.DO_NODE_TAG}

    do_api_response = requests.get(api_url,
                                   params=payload,
                                   headers=self.DO_REQ_HEADERS)

    do_nodes = do_api_response.json()

    for do_droplet in do_nodes['droplets']:
        if do_droplet['id'] == node_id:
            return do_droplet['status']