diff --git a/lib/rapi/client.py b/lib/rapi/client.py index 70678f46f7180be0ce995976bcbf2dc5cb0ca11a..dc36bd0e807c83269c5ca94043eff168df893dc9 100644 --- a/lib/rapi/client.py +++ b/lib/rapi/client.py @@ -333,8 +333,6 @@ class GanetiRapiClient(object): self._port = port self._logger = logger - self._version = None - self._base_url = "https://%s:%s" % (host, port) handlers = [_HTTPSHandler(self._logger, config_ssl_verification)] @@ -357,32 +355,25 @@ class GanetiRapiClient(object): "User-Agent": self.USER_AGENT, } - def _MakeUrl(self, path, query=None, prepend_version=True): + def _MakeUrl(self, path, query=None): """Constructs the URL to pass to the HTTP client. @type path: str @param path: HTTP URL path @type query: list of two-tuples @param query: query arguments to pass to urllib.urlencode - @type prepend_version: bool - @param prepend_version: whether to automatically fetch and prepend the - Ganeti RAPI version to the URL path @rtype: str @return: URL path """ - if prepend_version: - path = "/%d%s" % (self.GetVersion(), path) - return "https://%(host)s:%(port)d%(path)s?%(query)s" % { "host": self._host, "port": self._port, "path": path, "query": urllib.urlencode(query or [])} - def _SendRequest(self, method, path, query=None, content=None, - prepend_version=True): + def _SendRequest(self, method, path, query=None, content=None): """Sends an HTTP request. This constructs a full URL, encodes and decodes HTTP bodies, and @@ -396,9 +387,6 @@ class GanetiRapiClient(object): @param query: query arguments to pass to urllib.urlencode @type content: str or None @param content: HTTP body content - @type prepend_version: bool - @param prepend_version: whether to automatically fetch and prepend the - Ganeti RAPI version to the URL path @rtype: str @return: JSON-Decoded response @@ -410,7 +398,7 @@ class GanetiRapiClient(object): if content: content = simplejson.JSONEncoder(sort_keys=True).encode(content) - url = self._MakeUrl(path, query, prepend_version) + url = self._MakeUrl(path, query) req = _RapiRequest(method, url, self._headers, content) @@ -442,10 +430,7 @@ class GanetiRapiClient(object): @return: Ganeti Remote API version """ - if self._version is None: - self._version = self._SendRequest(HTTP_GET, "/version", - prepend_version=False) - return self._version + return self._SendRequest(HTTP_GET, "/version") def GetOperatingSystems(self): """Gets the Operating Systems running in the Ganeti cluster. @@ -454,7 +439,7 @@ class GanetiRapiClient(object): @return: operating systems """ - return self._SendRequest(HTTP_GET, "/os") + return self._SendRequest(HTTP_GET, "/2/os") def GetInfo(self): """Gets info about the cluster. @@ -463,7 +448,7 @@ class GanetiRapiClient(object): @return: information about the cluster """ - return self._SendRequest(HTTP_GET, "/info") + return self._SendRequest(HTTP_GET, "/2/info") def GetClusterTags(self): """Gets the cluster tags. @@ -472,7 +457,7 @@ class GanetiRapiClient(object): @return: cluster tags """ - return self._SendRequest(HTTP_GET, "/tags") + return self._SendRequest(HTTP_GET, "/2/tags") def AddClusterTags(self, tags, dry_run=False): """Adds tags to the cluster. @@ -490,7 +475,7 @@ class GanetiRapiClient(object): if dry_run: query.append(("dry-run", 1)) - return self._SendRequest(HTTP_PUT, "/tags", query) + return self._SendRequest(HTTP_PUT, "/2/tags", query) def DeleteClusterTags(self, tags, dry_run=False): """Deletes tags from the cluster. @@ -505,7 +490,7 @@ class GanetiRapiClient(object): if dry_run: query.append(("dry-run", 1)) - self._SendRequest(HTTP_DELETE, "/tags", query) + self._SendRequest(HTTP_DELETE, "/2/tags", query) def GetInstances(self, bulk=False): """Gets information about instances on the cluster. @@ -521,7 +506,7 @@ class GanetiRapiClient(object): if bulk: query.append(("bulk", 1)) - instances = self._SendRequest(HTTP_GET, "/instances", query) + instances = self._SendRequest(HTTP_GET, "/2/instances", query) if bulk: return instances else: @@ -538,7 +523,7 @@ class GanetiRapiClient(object): @return: info about the instance """ - return self._SendRequest(HTTP_GET, "/instances/%s" % instance) + return self._SendRequest(HTTP_GET, "/2/instances/%s" % instance) def CreateInstance(self, dry_run=False): """Creates a new instance. @@ -555,7 +540,7 @@ class GanetiRapiClient(object): if dry_run: query.append(("dry-run", 1)) - return self._SendRequest(HTTP_POST, "/instances", query) + return self._SendRequest(HTTP_POST, "/2/instances", query) def DeleteInstance(self, instance, dry_run=False): """Deletes an instance. @@ -571,7 +556,7 @@ class GanetiRapiClient(object): if dry_run: query.append(("dry-run", 1)) - return self._SendRequest(HTTP_DELETE, "/instances/%s" % instance, query) + return self._SendRequest(HTTP_DELETE, "/2/instances/%s" % instance, query) def GetInstanceTags(self, instance): """Gets tags for an instance. @@ -583,7 +568,7 @@ class GanetiRapiClient(object): @return: tags for the instance """ - return self._SendRequest(HTTP_GET, "/instances/%s/tags" % instance) + return self._SendRequest(HTTP_GET, "/2/instances/%s/tags" % instance) def AddInstanceTags(self, instance, tags, dry_run=False): """Adds tags to an instance. @@ -603,7 +588,7 @@ class GanetiRapiClient(object): if dry_run: query.append(("dry-run", 1)) - return self._SendRequest(HTTP_PUT, "/instances/%s/tags" % instance, query) + return self._SendRequest(HTTP_PUT, "/2/instances/%s/tags" % instance, query) def DeleteInstanceTags(self, instance, tags, dry_run=False): """Deletes tags from an instance. @@ -620,7 +605,7 @@ class GanetiRapiClient(object): if dry_run: query.append(("dry-run", 1)) - self._SendRequest(HTTP_DELETE, "/instances/%s/tags" % instance, query) + self._SendRequest(HTTP_DELETE, "/2/instances/%s/tags" % instance, query) def RebootInstance(self, instance, reboot_type=None, ignore_secondaries=None, dry_run=False): @@ -645,7 +630,7 @@ class GanetiRapiClient(object): if dry_run: query.append(("dry-run", 1)) - self._SendRequest(HTTP_POST, "/instances/%s/reboot" % instance, query) + self._SendRequest(HTTP_POST, "/2/instances/%s/reboot" % instance, query) def ShutdownInstance(self, instance, dry_run=False): """Shuts down an instance. @@ -660,7 +645,7 @@ class GanetiRapiClient(object): if dry_run: query.append(("dry-run", 1)) - self._SendRequest(HTTP_PUT, "/instances/%s/shutdown" % instance, query) + self._SendRequest(HTTP_PUT, "/2/instances/%s/shutdown" % instance, query) def StartupInstance(self, instance, dry_run=False): """Starts up an instance. @@ -675,7 +660,7 @@ class GanetiRapiClient(object): if dry_run: query.append(("dry-run", 1)) - self._SendRequest(HTTP_PUT, "/instances/%s/startup" % instance, query) + self._SendRequest(HTTP_PUT, "/2/instances/%s/startup" % instance, query) def ReinstallInstance(self, instance, os, no_startup=False): """Reinstalls an instance. @@ -691,7 +676,7 @@ class GanetiRapiClient(object): query = [("os", os)] if no_startup: query.append(("nostartup", 1)) - self._SendRequest(HTTP_POST, "/instances/%s/reinstall" % instance, query) + self._SendRequest(HTTP_POST, "/2/instances/%s/reinstall" % instance, query) def ReplaceInstanceDisks(self, instance, disks, mode="replace_auto", remote_node=None, iallocator="hail", dry_run=False): @@ -737,7 +722,7 @@ class GanetiRapiClient(object): query.append(("dry-run", 1)) return self._SendRequest(HTTP_POST, - "/instances/%s/replace-disks" % instance, query) + "/2/instances/%s/replace-disks" % instance, query) def GetJobs(self): """Gets all jobs for the cluster. @@ -746,7 +731,7 @@ class GanetiRapiClient(object): @return: job ids for the cluster """ - return [int(j["id"]) for j in self._SendRequest(HTTP_GET, "/jobs")] + return [int(j["id"]) for j in self._SendRequest(HTTP_GET, "/2/jobs")] def GetJobStatus(self, job_id): """Gets the status of a job. @@ -758,7 +743,7 @@ class GanetiRapiClient(object): @return: job status """ - return self._SendRequest(HTTP_GET, "/jobs/%d" % job_id) + return self._SendRequest(HTTP_GET, "/2/jobs/%d" % job_id) def DeleteJob(self, job_id, dry_run=False): """Deletes a job. @@ -773,7 +758,7 @@ class GanetiRapiClient(object): if dry_run: query.append(("dry-run", 1)) - self._SendRequest(HTTP_DELETE, "/jobs/%d" % job_id, query) + self._SendRequest(HTTP_DELETE, "/2/jobs/%d" % job_id, query) def GetNodes(self, bulk=False): """Gets all nodes in the cluster. @@ -790,7 +775,7 @@ class GanetiRapiClient(object): if bulk: query.append(("bulk", 1)) - nodes = self._SendRequest(HTTP_GET, "/nodes", query) + nodes = self._SendRequest(HTTP_GET, "/2/nodes", query) if bulk: return nodes else: @@ -806,7 +791,7 @@ class GanetiRapiClient(object): @return: info about the node """ - return self._SendRequest(HTTP_GET, "/nodes/%s" % node) + return self._SendRequest(HTTP_GET, "/2/nodes/%s" % node) def EvacuateNode(self, node, iallocator=None, remote_node=None, dry_run=False): @@ -838,7 +823,7 @@ class GanetiRapiClient(object): if dry_run: query.append(("dry-run", 1)) - return self._SendRequest(HTTP_POST, "/nodes/%s/evacuate" % node, query) + return self._SendRequest(HTTP_POST, "/2/nodes/%s/evacuate" % node, query) def MigrateNode(self, node, live=True, dry_run=False): """Migrates all primary instances from a node. @@ -860,7 +845,7 @@ class GanetiRapiClient(object): if dry_run: query.append(("dry-run", 1)) - return self._SendRequest(HTTP_POST, "/nodes/%s/migrate" % node, query) + return self._SendRequest(HTTP_POST, "/2/nodes/%s/migrate" % node, query) def GetNodeRole(self, node): """Gets the current role for a node. @@ -872,7 +857,7 @@ class GanetiRapiClient(object): @return: the current role for a node """ - return self._SendRequest(HTTP_GET, "/nodes/%s/role" % node) + return self._SendRequest(HTTP_GET, "/2/nodes/%s/role" % node) def SetNodeRole(self, node, role, force=False): """Sets the role for a node. @@ -894,7 +879,7 @@ class GanetiRapiClient(object): raise InvalidNodeRole("%s is not a valid node role.", role) query = [("force", force)] - return self._SendRequest(HTTP_PUT, "/nodes/%s/role" % node, query, + return self._SendRequest(HTTP_PUT, "/2/nodes/%s/role" % node, query, content=role) def GetNodeStorageUnits(self, node, storage_type, output_fields): @@ -918,7 +903,7 @@ class GanetiRapiClient(object): raise InvalidStorageType("%s is an invalid storage type.", storage_type) query = [("storage_type", storage_type), ("output_fields", output_fields)] - return self._SendRequest(HTTP_GET, "/nodes/%s/storage" % node, query) + return self._SendRequest(HTTP_GET, "/2/nodes/%s/storage" % node, query) def ModifyNodeStorageUnits(self, node, storage_type, name, allocatable=True): """Modifies parameters of storage units on the node. @@ -945,7 +930,8 @@ class GanetiRapiClient(object): ("storage_type", storage_type), ("name", name), ("allocatable", allocatable) ] - return self._SendRequest(HTTP_PUT, "/nodes/%s/storage/modify" % node, query) + return self._SendRequest(HTTP_PUT, "/2/nodes/%s/storage/modify" % node, + query) def RepairNodeStorageUnits(self, node, storage_type, name): """Repairs a storage unit on the node. @@ -967,7 +953,8 @@ class GanetiRapiClient(object): raise InvalidStorageType("%s is an invalid storage type.", storage_type) query = [("storage_type", storage_type), ("name", name)] - return self._SendRequest(HTTP_PUT, "/nodes/%s/storage/repair" % node, query) + return self._SendRequest(HTTP_PUT, "/2/nodes/%s/storage/repair" % node, + query) def GetNodeTags(self, node): """Gets the tags for a node. @@ -979,7 +966,7 @@ class GanetiRapiClient(object): @return: tags for the node """ - return self._SendRequest(HTTP_GET, "/nodes/%s/tags" % node) + return self._SendRequest(HTTP_GET, "/2/nodes/%s/tags" % node) def AddNodeTags(self, node, tags, dry_run=False): """Adds tags to a node. @@ -999,7 +986,7 @@ class GanetiRapiClient(object): if dry_run: query.append(("dry-run", 1)) - return self._SendRequest(HTTP_PUT, "/nodes/%s/tags" % node, query, + return self._SendRequest(HTTP_PUT, "/2/nodes/%s/tags" % node, query, content=tags) def DeleteNodeTags(self, node, tags, dry_run=False): @@ -1020,4 +1007,4 @@ class GanetiRapiClient(object): if dry_run: query.append(("dry-run", 1)) - return self._SendRequest(HTTP_DELETE, "/nodes/%s/tags" % node, query) + return self._SendRequest(HTTP_DELETE, "/2/nodes/%s/tags" % node, query)