Revision f629a262
b/lib/rapi/client.py | ||
---|---|---|
1625 | 1625 |
("/%s/nodes/%s/tags" % |
1626 | 1626 |
(GANETI_RAPI_VERSION, node)), query, None) |
1627 | 1627 |
|
1628 |
def GetNetworks(self, bulk=False): |
|
1629 |
"""Gets all networks in the cluster. |
|
1630 |
|
|
1631 |
@type bulk: bool |
|
1632 |
@param bulk: whether to return all information about the networks |
|
1633 |
|
|
1634 |
@rtype: list of dict or str |
|
1635 |
@return: if bulk is true, a list of dictionaries with info about all |
|
1636 |
networks in the cluster, else a list of names of those networks |
|
1637 |
|
|
1638 |
""" |
|
1639 |
query = [] |
|
1640 |
_AppendIf(query, bulk, ("bulk", 1)) |
|
1641 |
|
|
1642 |
networks = self._SendRequest(HTTP_GET, "/%s/networks" % GANETI_RAPI_VERSION, |
|
1643 |
query, None) |
|
1644 |
if bulk: |
|
1645 |
return networks |
|
1646 |
else: |
|
1647 |
return [n["name"] for n in networks] |
|
1648 |
|
|
1649 |
def GetNetwork(self, network): |
|
1650 |
"""Gets information about a network. |
|
1651 |
|
|
1652 |
@type group: str |
|
1653 |
@param group: name of the network whose info to return |
|
1654 |
|
|
1655 |
@rtype: dict |
|
1656 |
@return: info about the network |
|
1657 |
|
|
1658 |
""" |
|
1659 |
return self._SendRequest(HTTP_GET, |
|
1660 |
"/%s/networks/%s" % (GANETI_RAPI_VERSION, network), |
|
1661 |
None, None) |
|
1662 |
|
|
1663 |
def CreateNetwork(self, network_name, network, gateway=None, network6=None, |
|
1664 |
gateway6=None, mac_prefix=None, network_type=None, |
|
1665 |
add_reserved_ips=None, dry_run=False): |
|
1666 |
"""Creates a new network. |
|
1667 |
|
|
1668 |
@type name: str |
|
1669 |
@param name: the name of network to create |
|
1670 |
@type dry_run: bool |
|
1671 |
@param dry_run: whether to peform a dry run |
|
1672 |
|
|
1673 |
@rtype: string |
|
1674 |
@return: job id |
|
1675 |
|
|
1676 |
""" |
|
1677 |
query = [] |
|
1678 |
_AppendDryRunIf(query, dry_run) |
|
1679 |
|
|
1680 |
body = { |
|
1681 |
"network_name": network_name, |
|
1682 |
"gateway": gateway, |
|
1683 |
"network": network, |
|
1684 |
"gateway6": gateway6, |
|
1685 |
"network6": network6, |
|
1686 |
"mac_prefix": mac_prefix, |
|
1687 |
"network_type": network_type, |
|
1688 |
"add_reserved_ips": add_reserved_ips |
|
1689 |
} |
|
1690 |
|
|
1691 |
return self._SendRequest(HTTP_POST, "/%s/networks" % GANETI_RAPI_VERSION, |
|
1692 |
query, body) |
|
1693 |
|
|
1694 |
def ConnectNetwork(self, network_name, group_name, mode, link): |
|
1695 |
"""Connects a Network to a NodeGroup with the given netparams |
|
1696 |
|
|
1697 |
""" |
|
1698 |
body = { |
|
1699 |
"group_name": group_name, |
|
1700 |
"network_mode": mode, |
|
1701 |
"network_link": link |
|
1702 |
} |
|
1703 |
|
|
1704 |
return self._SendRequest(HTTP_PUT, |
|
1705 |
("/%s/networks/%s/connect" % |
|
1706 |
(GANETI_RAPI_VERSION, network_name)), None, body) |
|
1707 |
|
|
1708 |
def DisconnectNetwork(self, network_name, group_name): |
|
1709 |
"""Connects a Network to a NodeGroup with the given netparams |
|
1710 |
|
|
1711 |
""" |
|
1712 |
body = { |
|
1713 |
"group_name": group_name |
|
1714 |
} |
|
1715 |
return self._SendRequest(HTTP_PUT, |
|
1716 |
("/%s/networks/%s/disconnect" % |
|
1717 |
(GANETI_RAPI_VERSION, network_name)), None, body) |
|
1718 |
|
|
1719 |
|
|
1720 |
def DeleteNetwork(self, network, dry_run=False): |
|
1721 |
"""Deletes a network. |
|
1722 |
|
|
1723 |
@type group: str |
|
1724 |
@param group: the network to delete |
|
1725 |
@type dry_run: bool |
|
1726 |
@param dry_run: whether to peform a dry run |
|
1727 |
|
|
1728 |
@rtype: string |
|
1729 |
@return: job id |
|
1730 |
|
|
1731 |
""" |
|
1732 |
query = [] |
|
1733 |
_AppendDryRunIf(query, dry_run) |
|
1734 |
|
|
1735 |
return self._SendRequest(HTTP_DELETE, |
|
1736 |
("/%s/networks/%s" % |
|
1737 |
(GANETI_RAPI_VERSION, network)), query, None) |
|
1738 |
|
|
1628 | 1739 |
def GetGroups(self, bulk=False): |
1629 | 1740 |
"""Gets all node groups in the cluster. |
1630 | 1741 |
|
b/lib/rapi/connector.py | ||
---|---|---|
89 | 89 |
|
90 | 90 |
|
91 | 91 |
def GetHandlers(node_name_pattern, instance_name_pattern, |
92 |
group_name_pattern, job_id_pattern, disk_pattern, |
|
92 |
group_name_pattern, network_name_pattern, |
|
93 |
job_id_pattern, disk_pattern, |
|
93 | 94 |
query_res_pattern): |
94 | 95 |
"""Returns all supported resources and their handlers. |
95 | 96 |
|
... | ... | |
167 | 168 |
re.compile(r"^/2/instances/(%s)/console$" % instance_name_pattern): |
168 | 169 |
rlib2.R_2_instances_name_console, |
169 | 170 |
|
171 |
"/2/networks": rlib2.R_2_networks, |
|
172 |
re.compile(r"^/2/networks/(%s)$" % network_name_pattern): |
|
173 |
rlib2.R_2_networks_name, |
|
174 |
re.compile(r"^/2/networks/(%s)/connect$" % network_name_pattern): |
|
175 |
rlib2.R_2_networks_name_connect, |
|
176 |
re.compile(r"^/2/networks/(%s)/disconnect$" % network_name_pattern): |
|
177 |
rlib2.R_2_networks_name_disconnect, |
|
178 |
|
|
170 | 179 |
"/2/groups": rlib2.R_2_groups, |
171 | 180 |
re.compile(r"^/2/groups/(%s)$" % group_name_pattern): |
172 | 181 |
rlib2.R_2_groups_name, |
... | ... | |
197 | 206 |
} |
198 | 207 |
|
199 | 208 |
|
200 |
CONNECTOR.update(GetHandlers(_NAME_PATTERN, _NAME_PATTERN, _NAME_PATTERN, |
|
209 |
CONNECTOR.update(GetHandlers(_NAME_PATTERN, _NAME_PATTERN, |
|
210 |
_NAME_PATTERN, _NAME_PATTERN, |
|
201 | 211 |
constants.JOB_ID_TEMPLATE, _DISK_PATTERN, |
202 | 212 |
_NAME_PATTERN)) |
b/lib/rapi/rlib2.py | ||
---|---|---|
70 | 70 |
I_FIELDS = ["name", "admin_state", "os", |
71 | 71 |
"pnode", "snodes", |
72 | 72 |
"disk_template", |
73 |
"nic.ips", "nic.macs", "nic.modes", "nic.links", "nic.bridges", |
|
73 |
"nic.ips", "nic.macs", "nic.modes", |
|
74 |
"nic.links", "nic.networks", "nic.bridges", |
|
74 | 75 |
"network_port", |
75 | 76 |
"disk.sizes", "disk_usage", |
76 | 77 |
"beparams", "hvparams", |
... | ... | |
90 | 91 |
"group.uuid", |
91 | 92 |
] + _COMMON_FIELDS |
92 | 93 |
|
94 |
NET_FIELDS = ["name", "network", "gateway", |
|
95 |
"network6", "gateway6", |
|
96 |
"mac_prefix", "network_type", |
|
97 |
"free_count", "reserved_count", |
|
98 |
"map", "group_list", "inst_list", |
|
99 |
"external_reservations", |
|
100 |
] |
|
101 |
|
|
93 | 102 |
G_FIELDS = [ |
94 | 103 |
"alloc_policy", |
95 | 104 |
"name", |
... | ... | |
642 | 651 |
}) |
643 | 652 |
|
644 | 653 |
|
654 |
class R_2_networks(baserlib.OpcodeResource): |
|
655 |
"""/2/networks resource. |
|
656 |
|
|
657 |
""" |
|
658 |
GET_OPCODE = opcodes.OpNetworkQuery |
|
659 |
POST_OPCODE = opcodes.OpNetworkAdd |
|
660 |
POST_RENAME = { |
|
661 |
"name": "network_name", |
|
662 |
} |
|
663 |
|
|
664 |
def GetPostOpInput(self): |
|
665 |
"""Create a network. |
|
666 |
|
|
667 |
""" |
|
668 |
assert not self.items |
|
669 |
return (self.request_body, { |
|
670 |
"dry_run": self.dryRun(), |
|
671 |
}) |
|
672 |
|
|
673 |
def GET(self): |
|
674 |
"""Returns a list of all networks. |
|
675 |
|
|
676 |
""" |
|
677 |
client = self.GetClient() |
|
678 |
|
|
679 |
if self.useBulk(): |
|
680 |
bulkdata = client.QueryNetworks([], NET_FIELDS, False) |
|
681 |
return baserlib.MapBulkFields(bulkdata, NET_FIELDS) |
|
682 |
else: |
|
683 |
data = client.QueryNetworks([], ["name"], False) |
|
684 |
networknames = [row[0] for row in data] |
|
685 |
return baserlib.BuildUriList(networknames, "/2/networks/%s", |
|
686 |
uri_fields=("name", "uri")) |
|
687 |
|
|
688 |
|
|
689 |
class R_2_networks_name(baserlib.OpcodeResource): |
|
690 |
"""/2/network/[network_name] resource. |
|
691 |
|
|
692 |
""" |
|
693 |
DELETE_OPCODE = opcodes.OpNetworkRemove |
|
694 |
|
|
695 |
def GET(self): |
|
696 |
"""Send information about a network. |
|
697 |
|
|
698 |
""" |
|
699 |
network_name = self.items[0] |
|
700 |
client = self.GetClient() |
|
701 |
|
|
702 |
result = baserlib.HandleItemQueryErrors(client.QueryNetworks, |
|
703 |
names=[network_name], |
|
704 |
fields=NET_FIELDS, |
|
705 |
use_locking=self.useLocking()) |
|
706 |
|
|
707 |
return baserlib.MapFields(NET_FIELDS, result[0]) |
|
708 |
|
|
709 |
def GetDeleteOpInput(self): |
|
710 |
"""Delete a network. |
|
711 |
|
|
712 |
""" |
|
713 |
assert len(self.items) == 1 |
|
714 |
return (self.request_body, { |
|
715 |
"network_name": self.items[0], |
|
716 |
"dry_run": self.dryRun(), |
|
717 |
}) |
|
718 |
|
|
719 |
class R_2_networks_name_connect(baserlib.OpcodeResource): |
|
720 |
"""/2/network/[network_name]/connect. |
|
721 |
|
|
722 |
""" |
|
723 |
PUT_OPCODE = opcodes.OpNetworkConnect |
|
724 |
|
|
725 |
def GetPutOpInput(self): |
|
726 |
"""Changes some parameters of node group. |
|
727 |
|
|
728 |
""" |
|
729 |
assert self.items |
|
730 |
return (self.request_body, { |
|
731 |
"network_name": self.items[0], |
|
732 |
}) |
|
733 |
|
|
734 |
class R_2_networks_name_disconnect(baserlib.OpcodeResource): |
|
735 |
"""/2/network/[network_name]/disconnect. |
|
736 |
|
|
737 |
""" |
|
738 |
PUT_OPCODE = opcodes.OpNetworkDisconnect |
|
739 |
|
|
740 |
def GetPutOpInput(self): |
|
741 |
"""Changes some parameters of node group. |
|
742 |
|
|
743 |
""" |
|
744 |
assert self.items |
|
745 |
return (self.request_body, { |
|
746 |
"network_name": self.items[0], |
|
747 |
}) |
|
748 |
|
|
645 | 749 |
class R_2_groups(baserlib.OpcodeResource): |
646 | 750 |
"""/2/groups resource. |
647 | 751 |
|
... | ... | |
655 | 759 |
def GetPostOpInput(self): |
656 | 760 |
"""Create a node group. |
657 | 761 |
|
762 |
|
|
658 | 763 |
""" |
659 | 764 |
assert not self.items |
660 | 765 |
return (self.request_body, { |
Also available in: Unified diff