def GetEventsJson(self,
                      namespace='default',
                      involved_obj_kind=None,
                      involved_obj_name=None):
        url = '{}/namespaces/{}/events'.format(self.base_url, namespace)

        selector = {}
        if involved_obj_kind is not None:
            selector['involvedObject.kind'] = involved_obj_kind
        if involved_obj_name is not None:
            selector['involvedObject.name'] = involved_obj_name

        if len(selector):
            url = self._BuildUrl(url,
                                 extra_params={
                                     'fieldSelector':
                                     self._gen_selector_str(selector)
                                 })
        json = self._RequestUrl(url, 'GET')
        if json.status_code not in [200, 404]:
            raise KubernetesError(json.json()['message'], json.status_code)
        elif json.status_code == 404:
            raise KubernetesError('Can not find the resource', 404)

        result = self._ParseAndCheckKubernetes(json.content)
        if len(result['items']) == 0:
            return None

        return result['items']
 def ResizeReplicationController(self, name, replicas, namespace='default'):
     '''Update an existing ReplicationController by given data'''
     #retrieve the specific replicationcontroller first
     json = self._HandleReplicationController(name=name,
                                              action='GET',
                                              namespace=namespace)
     if json.status_code == 404:
         #not exit, just return None
         return None
     if json.status_code is not 200:
         raise KubernetesError({
             'message':
             'parsing error [' + simplejson.dumps(json.content) + ']'
         })
     data = self._ParseAndCheckKubernetes(json.content)
     #update the value of replicas, note, for v1beta3 only
     data['spec']['replicas'] = replicas
     json = self._HandleReplicationController(
         name=name,
         action='PUT',
         namespace=namespace,
         data_str=simplejson.dumps(data))
     if json.status_code is not 200:
         raise KubernetesError({
             'message':
             'parsing error [' + simplejson.dumps(json.content) + ']'
         })
     result = self._ParseAndCheckKubernetes(json.content)
     return ReplicationController.NewFromJsonDict(result)
Exemple #3
0
    def _RequestUrl(self, url, verb, data=None):
        '''Request a url.
		
			Args:
			 url:
			 	The web location we want to retrieve.
			 verb:
			 	POST, GET, PUT, DELETE.
			 data:
			 	a dict of (str, unicode) key/value pairs.

			Returns:
			 A JSON object.
		'''
        if verb == 'POST':
            try:
                return requests.post(url,
                                     data=data,
                                     auth=self.__auth,
                                     timeout=self._timeout,
                                     verify=False)
            except requests.RequestException as e:
                raise KubernetesError(str(e))
        if verb == 'GET':
            try:
                return requests.get(url,
                                    auth=self.__auth,
                                    timeout=self._timeout,
                                    verify=False)
            except requests.RequestException as e:
                raise KubernetesError(str(e))
        if verb == 'PUT':
            try:
                return requests.put(url,
                                    data=data,
                                    auth=self.__auth,
                                    timeout=self._timeout,
                                    verify=False)
            except requests.RequestException as e:
                raise KubernetesError(str(e))
        if verb == 'DELETE':
            try:
                return requests.get(url,
                                    auth=self.__auth,
                                    timeout=self._timeout,
                                    verify=False)
            except requests.RequestException as e:
                raise KubernetesError(str(e))
        return 0
    def RemoveLabel(self,
                    resource_type,
                    resource_name,
                    label_list,
                    namespace=None):
        '''
        If the label already exists in the resource, its value will be replaced by new value.
        If the label does not exist in the resource, the label will be added.
        '''

        url = None
        if resource_type == ResourceType.Node:
            # Make and send requests
            url = ('%(base_url)s/nodes/%(node_name)s' % {
                "base_url": self.base_url,
                "node_name": resource_name
            })
            data = list()
            for label in label_list:
                data.append({
                    'op': 'remove',
                    'path': '/metadata/labels/' + label
                })
            reply = self._RequestUrl(
                url, 'PATCH', json.dumps(data),
                {'Content-Type': 'application/json-patch+json'})
            if reply.status_code is not 200:
                raise KubernetesError({
                    'message':
                    'parsing error [' + simplejson.dumps(reply.content) + ']'
                })
        else:
            raise ReqNotSupported
    def DeleteResourceQuota(self, name, namespace='default'):
        '''Delete a resource quota '''

        url = ('%(base_url)s/namespaces/%(ns)s/resourcequotas/%(name)s' % {
            "base_url": self.base_url,
            "ns": namespace,
            "name": name
        })
        json = self._RequestUrl(url, 'DELETE')
        if json.status_code not in [200, 404]:
            raise KubernetesError(json.json()['message'], json.status_code)
    def _ParseAndCheckKubernetes(self, json):
        '''Try and parse the JSON returned from Kubernetes and return
        an empty dictionary if there is any error
        '''

        try:
            data = simplejson.loads(json)
        except ValueError:
            raise KubernetesError({'message': 'parsing error [' + json + ']'})

        return data
    def DeletePods(self, name, namespace='default'):
        '''Delete a new Pod'''

        url = ('%(base_url)s/namespaces/%(ns)s/pods/%(name)s' % {
            "base_url": self.base_url,
            "ns": namespace,
            "name": name
        })
        json = self._RequestUrl(url, 'DELETE')
        if json.status_code not in [200, 404]:
            raise KubernetesError({
                'message':
                'parsing error [' + simplejson.dumps(json.content) + ']'
            })
        if json.status_code == 404:
            raise KubernetesError({
                'message':
                'can not find the pod <{0}> in namespace <{1}>'.format(
                    name, namespace)
            })
    def CreateResourceQuota(self, data, namespace='default'):
        '''Create a new ResourceQuota'''

        url = ('%(base_url)s/namespaces/%(ns)s/resourcequotas' % {
            "base_url": self.base_url,
            "ns": namespace
        })
        json = self._RequestUrl(url, 'POST', data)
        if json.status_code is not 201:
            raise KubernetesError(json.json()['message'], json.status_code)
        result = self._ParseAndCheckKubernetes(json.content)
        return ResourceQuota(result)
    def CreateReplicationController(self, data, namespace='default'):
        '''Create a new ReplicationController'''

        url = ('%(base_url)s/namespaces/%(ns)s/replicationcontrollers' % {
            "base_url": self.base_url,
            "ns": namespace
        })
        json = self._RequestUrl(url, 'POST', data)
        if json.status_code is not 201:
            raise KubernetesError(json.json()['message'], json.status_code)
        result = self._ParseAndCheckKubernetes(json.content)
        return ReplicationController.NewFromJsonDict(result)
Exemple #10
0
    def GetResourceQuota(self, name, namespace='default'):
        url = ('%(base_url)s/namespaces/%(ns)s/resourcequotas/%(name)s' % {
            "base_url": self.base_url,
            "ns": namespace,
            "name": name
        })
        json = self._RequestUrl(url, 'GET')
        if json.status_code not in [200, 404]:
            raise KubernetesError(json.json()['message'], json.status_code)
        elif json.status_code == 404:
            return None

        result = self._ParseAndCheckKubernetes(json.content)
        return ResourceQuota(result)
Exemple #11
0
    def DeleteService(self, name, namespace='default'):
        '''Delete a new Service'''

        url = ('%(base_url)s/namespaces/%(ns)s/services/%(name)s' % {
            "base_url": self.base_url,
            "ns": namespace,
            "name": name
        })
        json = self._RequestUrl(url, 'DELETE')
        if json.status_code not in [200, 404]:
            raise KubernetesError({
                'message':
                'parsing error [' + simplejson.dumps(json.content) + ']'
            })
Exemple #12
0
    def CreatePod(self, data, namespace='default'):
        '''Create a new Pod'''

        url = ('%(base_url)s/namespaces/%(ns)s/pods' % {
            "base_url": self.base_url,
            "ns": namespace
        })
        json = self._RequestUrl(url, 'PUT', data)
        if json.status_code is not 201:
            raise KubernetesError({
                'message':
                'parsing error [' + simplejson.dumps(json.content) + ']'
            })
        result = self._ParseAndCheckKubernetes(json.content)
        return Pod.NewFromJsonDict(result)
Exemple #13
0
    def SetNodeSchedulable(self, node_name, is_scheduable=True):
        ''' Make the node as unscheduable '''

        # Make and send requests
        url = ('%(base_url)s/nodes/%(node_name)s' % {
            "base_url": self.base_url,
            "node_name": node_name
        })

        if is_scheduable:
            data = '{"spec":{"unschedulable":false}}'
        else:
            data = '{"spec":{"unschedulable":true}}'

        json = self._RequestUrl(url, 'PATCH', data)
        if json.status_code is not 200:
            raise KubernetesError({
                'message':
                'parsing error [' + simplejson.dumps(json.content) + ']'
            })
        result = self._ParseAndCheckKubernetes(json.content)
        return Pod.NewFromJsonDict(result)
Exemple #14
0
    def _RequestUrl(self, url, verb, data=None, request_headers=None):
        '''Request a url.

            Args:
             url:
                 The web location we want to retrieve.
             verb:
                 POST, GET, PUT, DELETE.
             data:
                 a dict of (str, unicode) key/value pairs.

            Returns:
             A JSON object.
        '''
        headers = request_headers
        if self._request_headers is None:
            headers = request_headers
        elif headers is not None:
            headers = copy.deepcopy(self._request_headers)
            headers.update(request_headers)
        else:
            headers = self._request_headers

        if verb == 'POST':
            try:
                with requests.Session() as s:
                    return s.post(url,
                                  data=data,
                                  auth=None,
                                  timeout=self._timeout,
                                  verify=self._cert,
                                  headers=headers)
            except requests.RequestException as e:
                raise KubernetesError(str(e))
        if verb == 'GET':
            try:
                with requests.Session() as s:
                    return s.get(url,
                                 auth=None,
                                 timeout=self._timeout,
                                 verify=self._cert,
                                 headers=headers)
            except requests.RequestException as e:
                raise KubernetesError(str(e))
        if verb == 'PUT':
            try:
                with requests.Session() as s:
                    return s.put(url,
                                 data=data,
                                 auth=None,
                                 timeout=self._timeout,
                                 verify=self._cert,
                                 headers=headers)
            except requests.RequestException as e:
                raise KubernetesError(str(e))
        if verb == 'DELETE':
            try:
                with requests.Session() as s:
                    return s.delete(url,
                                    auth=None,
                                    timeout=self._timeout,
                                    verify=self._cert,
                                    headers=headers)
            except requests.RequestException as e:
                raise KubernetesError(str(e))
        if verb == 'PATCH':
            try:
                with requests.Session() as s:
                    return s.patch(url,
                                   data=data,
                                   auth=None,
                                   timeout=self._timeout,
                                   verify=self._cert,
                                   headers=headers)
            except requests.RequestException as e:
                raise KubernetesError(str(e))
        return 0
Exemple #15
0
    def __init__(self,
                 base_url,
                 cert_path=DEFAULT_CERT_PATH,
                 token=None,
                 input_encoding=None,
                 request_headers=None,
                 cache=DEFAULT_CACHE,
                 debugHTTP=None,
                 timeout=None):
        '''Instantiate a new kubernetes.Api object

        Args:
          input_encoding:
              The encoding used to encode input strings. [Optional]
          request_headers
              A dictionary of additional HTTP request headers. [Optional]
          cache:
              The cache instance to use. Defaults to DEFAULT_CACHE.
              Use None to disable caching. [Optional]
          base_url:
            The base URL to use to contact the kubernetes API.
            Defaults to https://10.245.1.2/api/v1beta2
          debugHTTP:
              Set to True to enable debug output from urllib2 when performing
            any HTTP requests.  Defaults to False. [Optional]
          timeout:
            Set timeout (in seconds) of the http/https requests. If None the
            requests lib default will be used.  Defaults to None. [Optional]
        '''
        self.SetCache(cache)
        self._urllib = urllib2
        self._input_encoding = input_encoding
        self._debugHTTP = debugHTTP
        self._timeout = timeout
        self.base_url = base_url
        self._cert = None
        self._ishttps = False

        if self.base_url.find('https') == 0:
            self._ishttps = True
            # check if the given credentials can be accessed and readable
            if not self._check_file_readable([cert_path]):
                raise KubernetesError(
                    "The given credentials files cannot be loaded")
            self.SetCredentials(cert=cert_path)
            if request_headers is not None:
                request_headers.update({"Authorization": "Bearer %s" % token})
            else:
                request_headers = {"Authorization": "Bearer %s" % token}

        self._InitializeRequestHeaders(request_headers)
        self._InitializeUserAgent()
        self._InitializeDefaultParameters()

        if debugHTTP:
            import logging
            import httplib
            httplib.HTTPConnection.debuglevel = 1

            logging.basicConfig()
            logging.getLogger().setLevel(logging.DEBUG)
            requests_log = logging.getLogger("requests.packages.urllib3")
            requests_log.setLevel(logging.DEBUG)
            requests_log.propagate = True
Exemple #16
0
    def __init__(self,
                 user_id=None,
                 user_password=None,
                 input_encoding=None,
                 request_headers=None,
                 cache=DEFAULT_CACHE,
                 base_url=None,
                 debugHTTP=None,
                 timeout=None):
        '''Instantiate a new kubernetes.Api object

		Args:
		  user_id:
		    Your agent user id
		  user_password
		    Your agent user password
		  input_encoding:
		  	The encoding used to encode input strings. [Optional]
		  request_headers
		  	A dictionary of additional HTTP request headers. [Optional]
		  cache:
		  	The cache instance to use. Defaults to DEFAULT_CACHE.
		  	Use None to disable caching. [Optional]
		  base_url:
		    The base URL to use to contact the kubernetes API.
		    Defaults to https://10.245.1.2/api/v1beta2
		  debugHTTP:
		  	Set to True to enable debug output from urllib2 when performing
			any HTTP requests.  Defaults to False. [Optional]
		  timeout:
			Set timeout (in seconds) of the http/https requests. If None the
			requests lib default will be used.  Defaults to None. [Optional]
		'''
        self.SetCache(cache)
        self._urllib = urllib2
        self._input_encoding = input_encoding
        self._debugHTTP = debugHTTP
        self._timeout = timeout

        self._InitializeRequestHeaders(request_headers)
        self._InitializeUserAgent()
        self._InitializeDefaultParameters()

        if base_url is None:
            self.base_url = 'https://10.245.1.2/api/v1beta2'
        else:
            self.base_url = base_url

        if user_id is None or user_password is None:
            print >> sys.stderr, 'Kubernetes requires user_id, user_password.'

            raise KubernetesError(
                {'message': "Kubernetes requires user_id and user_password"})

        self.SetCredentials(user_id, user_password)

        if debugHTTP:
            import logging
            import httplib
            httplib.HTTPConnection.debuglevel = 1

            logging.basicConfig()
            logging.getLogger().setLevel(logging.DEBUG)
            requests_log = logging.getLogger("requests.packages.urllib3")
            requests_log.setLevel(logging.DEBUG)
            requests_log.propagate = True