+ return self.SimpleFillBE(instance.beparams)
+
+ def SimpleFillNIC(self, nicparams):
+ """Fill a given nicparams dict with cluster defaults.
+
+ @type nicparams: dict
+ @param nicparams: the dict to fill
+ @rtype: dict
+ @return: a copy of the passed in nicparams with missing keys filled
+ from the cluster defaults
+
+ """
+ return FillDict(self.nicparams.get(constants.PP_DEFAULT, {}), nicparams)
+
+ def SimpleFillOS(self, os_name, os_params):
+ """Fill an instance's osparams dict with cluster defaults.
+
+ @type os_name: string
+ @param os_name: the OS name to use
+ @type os_params: dict
+ @param os_params: the dict to fill with default values
+ @rtype: dict
+ @return: a copy of the instance's osparams with missing keys filled from
+ the cluster defaults
+
+ """
+ name_only = os_name.split("+", 1)[0]
+ # base OS
+ result = self.osparams.get(name_only, {})
+ # OS with variant
+ result = FillDict(result, self.osparams.get(os_name, {}))
+ # specified params
+ return FillDict(result, os_params)
+
+ def FillND(self, node, nodegroup):
+ """Return filled out ndparams for L{objects.NodeGroup} and L{object.Node}
+
+ @type node: L{objects.Node}
+ @param node: A Node object to fill
+ @type nodegroup: L{objects.NodeGroup}
+ @param nodegroup: A Node object to fill
+ @return a copy of the node's ndparams with defaults filled
+
+ """
+ return self.SimpleFillND(nodegroup.FillND(node))
+
+ def SimpleFillND(self, ndparams):
+ """Fill a given ndparams dict with defaults.
+
+ @type ndparams: dict
+ @param ndparams: the dict to fill
+ @rtype: dict
+ @return: a copy of the passed in ndparams with missing keys filled
+ from the cluster defaults
+
+ """
+ return FillDict(self.ndparams, ndparams)
+
+
+class BlockDevStatus(ConfigObject):
+ """Config object representing the status of a block device."""
+ __slots__ = [
+ "dev_path",
+ "major",
+ "minor",
+ "sync_percent",
+ "estimated_time",
+ "is_degraded",
+ "ldisk_status",
+ ]
+
+
+class ImportExportStatus(ConfigObject):
+ """Config object representing the status of an import or export."""
+ __slots__ = [
+ "recent_output",
+ "listen_port",
+ "connected",
+ "progress_mbytes",
+ "progress_throughput",
+ "progress_eta",
+ "progress_percent",
+ "exit_status",
+ "error_message",
+ ] + _TIMESTAMPS
+
+
+class ImportExportOptions(ConfigObject):
+ """Options for import/export daemon
+
+ @ivar key_name: X509 key name (None for cluster certificate)
+ @ivar ca_pem: Remote peer CA in PEM format (None for cluster certificate)
+ @ivar compress: Compression method (one of L{constants.IEC_ALL})
+ @ivar magic: Used to ensure the connection goes to the right disk
+ @ivar ipv6: Whether to use IPv6
+ @ivar connect_timeout: Number of seconds for establishing connection
+
+ """
+ __slots__ = [
+ "key_name",
+ "ca_pem",
+ "compress",
+ "magic",
+ "ipv6",
+ "connect_timeout",
+ ]
+
+
+class ConfdRequest(ConfigObject):
+ """Object holding a confd request.
+
+ @ivar protocol: confd protocol version
+ @ivar type: confd query type
+ @ivar query: query request
+ @ivar rsalt: requested reply salt
+
+ """
+ __slots__ = [
+ "protocol",
+ "type",
+ "query",
+ "rsalt",
+ ]
+
+
+class ConfdReply(ConfigObject):
+ """Object holding a confd reply.
+
+ @ivar protocol: confd protocol version
+ @ivar status: reply status code (ok, error)
+ @ivar answer: confd query reply
+ @ivar serial: configuration serial number
+
+ """
+ __slots__ = [
+ "protocol",
+ "status",
+ "answer",
+ "serial",
+ ]
+
+
+class QueryFieldDefinition(ConfigObject):
+ """Object holding a query field definition.
+
+ @ivar name: Field name
+ @ivar title: Human-readable title
+ @ivar kind: Field type
+
+ """
+ __slots__ = [
+ "name",
+ "title",
+ "kind",
+ ]
+
+
+class _QueryResponseBase(ConfigObject):
+ __slots__ = [
+ "fields",
+ ]
+
+ def ToDict(self):
+ """Custom function for serializing.
+
+ """
+ mydict = super(_QueryResponseBase, self).ToDict()
+ mydict["fields"] = self._ContainerToDicts(mydict["fields"])
+ return mydict
+
+ @classmethod
+ def FromDict(cls, val):
+ """Custom function for de-serializing.
+
+ """
+ obj = super(_QueryResponseBase, cls).FromDict(val)
+ obj.fields = cls._ContainerFromDicts(obj.fields, list, QueryFieldDefinition)
+ return obj
+
+
+class QueryRequest(ConfigObject):
+ """Object holding a query request.
+
+ """
+ __slots__ = [
+ "what",
+ "fields",
+ "filter",
+ ]
+
+
+class QueryResponse(_QueryResponseBase):
+ """Object holding the response to a query.
+
+ @ivar fields: List of L{QueryFieldDefinition} objects
+ @ivar data: Requested data
+
+ """
+ __slots__ = [
+ "data",
+ ]
+
+
+class QueryFieldsRequest(ConfigObject):
+ """Object holding a request for querying available fields.
+
+ """
+ __slots__ = [
+ "what",
+ "fields",
+ ]
+
+
+class QueryFieldsResponse(_QueryResponseBase):
+ """Object holding the response to a query for fields.
+
+ @ivar fields: List of L{QueryFieldDefinition} objects
+
+ """
+ __slots__ = [
+ ]
+
+
+class InstanceConsole(ConfigObject):
+ """Object describing how to access the console of an instance.
+
+ """
+ __slots__ = [
+ "instance",
+ "kind",
+ "message",
+ "host",
+ "port",
+ "user",
+ "command",
+ "display",
+ ]
+
+ def Validate(self):
+ """Validates contents of this object.
+
+ """
+ assert self.kind in constants.CONS_ALL, "Unknown console type"
+ assert self.instance, "Missing instance name"
+ assert self.message or self.kind in [constants.CONS_SSH, constants.CONS_VNC]
+ assert self.host or self.kind == constants.CONS_MESSAGE
+ assert self.port or self.kind in [constants.CONS_MESSAGE,
+ constants.CONS_SSH]
+ assert self.user or self.kind in [constants.CONS_MESSAGE,
+ constants.CONS_VNC]
+ assert self.command or self.kind in [constants.CONS_MESSAGE,
+ constants.CONS_VNC]
+ assert self.display or self.kind in [constants.CONS_MESSAGE,
+ constants.CONS_SSH]
+ return True