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)
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)
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)
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) + ']' })
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)
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)
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
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
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