On 01/08/2014 02:24 AM, Aline Manera wrote:
On 01/07/2014 06:27 AM, Royce Lv wrote:
> On 2014年01月06日 16:49, shaohef(a)linux.vnet.ibm.com wrote:
>> From: ShaoHe Feng <shaohef(a)linux.vnet.ibm.com>
>>
>> Add vms field for network GET method
>> update API.md
>>
>> add a function to get all vms attach to a network
>> update model
>>
>> add vms field for Network Resource property
>> update controller
>>
>> Now get the info of default network:
>> $ curl -u <user>:<password> -H 'Content-type:
application/json' -H
>> 'Accept:
>> application/json' -X GET
http://localhost:8000/networks/default
>> {
>> "subnet":"192.168.122.0/24",
>> "connection":"nat",
>> "name":"default",
>> "autostart":true,
>> "state":"active",
>> "interface":"virbr0",
>> "dhcp":{
>> "start":"192.168.122.2",
>> "end":"192.168.122.254"
>> },
>> "vms":[
>> "rhel6",
>> "opensuse12"
>> ]
>> }
>> we can see, there are two vms attched to this network
>>
>> Signed-off-by: ShaoHe Feng <shaohef(a)linux.vnet.ibm.com>
>> ---
>> docs/API.md | 1 +
>> src/kimchi/control/networks.py | 1 +
>> src/kimchi/model.py | 15 +++++++++++++++
>> 3 files changed, 17 insertions(+)
>>
>> diff --git a/docs/API.md b/docs/API.md
>> index 0013e86..32045ac 100644
>> --- a/docs/API.md
>> +++ b/docs/API.md
>> @@ -364,6 +364,7 @@ A interface represents available interface on host.
>> * active: The Network is ready for use
>> * inactive: The Network is not available
>> * autostart: Network autostart onboot
>> + * vms: all vms attached to this network
>> * subnet: Network segment in slash-separated format with ip
>> address and prefix
>> * dhcp: DHCP services on the virtual network is enabled.
>> * start: start boundary of a pool of addresses to be
>> provided to DHCP clients.
>> diff --git a/src/kimchi/control/networks.py
>> b/src/kimchi/control/networks.py
>> index ad95d69..f3f0b41 100644
>> --- a/src/kimchi/control/networks.py
>> +++ b/src/kimchi/control/networks.py
>> @@ -40,6 +40,7 @@ class Network(Resource):
>> @property
>> def data(self):
>> return {'name': self.ident,
>> + 'vms': self.info['vms'],
> Shuming suggested to use /vms?network='net1' to query vm attatched to
> a network instead of using /networks/net1/vms
> Personally, previous URI is clearer and also can be integrated to vm
> query.
> I'd like we have some discussion with guys about which URL is to use.
I also prefer to use /vms?network='net1' to query which vms are using
network 'net1'
yes.
this patch set is the first step.
/vms?network='net1' is the next step.
let us discuss details of the next step in next sprint as it is an
advanced feature.
But we will know the network is not a VM's attribute, it is just a VM's
interface kind.
Not sure it is good as a query param.
step 1:
I have discussed with Yu Xin before. And at the beginning, Yu Xin and I
think just need to show the numbers of vms.
it is a quite light-weight field with only numbers of vms there.
This is the first UI design of network. but for let last release,
backend do not support VMS numbers, so yuxing remove the it.
--------------------------------------------------------------------------------------------------------------------------------
| Network Name | VMS | State | Network Type | Interface |
Address Space | Actions |
--------------------------------------------------------------------------------------------------------------------------------
| default | 254 | o | NAT | virbr |
192.168.122.0/24 | Actions |
--------------------------------------------------------------------------------------------------------------------------------
| net1 | 0 | o | NAT | virbr |
192.168.122.0/24 | Actions |
--------------------------------------------------------------------------------------------------------------------------------
The number of vms is a quite intuitive view of the network environment
and user can do some convenient operation directly.
For example, if a user wants to delete a network, it is easy to do his
choice by checking the number of this network.
The vms of net1 is "0", user can delete this network safely.
Also the vms of default is "254", if user just can choose net1 attached
to his VM.
Also a VMs number greatly decrease complexity at client side and improve
performance.
After add this vms muber filed, UI can just get /networks once to
finish network web page.
step 2:
we will draw a network topology with a switch in center and vms around
with all available information(name, interface, ip address...) of vm
that is helpful.
by this way, user can have a quite intuitive view of the network
environment and do some convenient operation directly there.
--------- --------- --------- ---------
| vm1 | | vm2 | | vm3 | | vm4|
--------- --------- --------- ---------
| | | |
| | | |
----------------------------------------------------------------
| |
| network1 |
| |
----------------------------------------------------------------
| | | |
| | | |
--------- --------- --------- ---------
| vm5 | | vm6 | | vm7 | | vm8|
--------- --------- --------- ---------
And the user click the vm5, the details will display:
----------------------------------------------------------------
| name | CPUS | memory | status | ... |
----------------------------------------------------------------
| VM1 | 1 | 1G | o | ... |
----------------------------------------------------------------
summary:
we can design our URL by:
a)
1. get the VMS numbers and network topology by:
get /networks/
[
{''net1": {bridge: brg1, vms: [vm1, vm2]},
{''net2": {bridge: brg2, vms: [vm3, vm4, vm5]}
]
The numbers field is: len(net1.vms)
The network topology is: net1.vms
2. get the vms info
get /vms/vm1
get /vms/vm2
b)get the VMS numbers
1.
get /networks/
[
{''net1": {bridge: brg1, vms: 2},
{''net2": {bridge: brg2, vms: 3}
]
2. get the network topology and vms info:
/vms?network='net1'
[
"vm1": {"CPUS": 1, "memory": 1G, "status":
"running"},
"vm2": {"CPUS": 1, "memory": 1G, "status":
"running"},
]
the network topology is net1.keys()
/vms?network='net2'
[
"vm3": {"CPUS": 1, "memory": 1G, "status":
"running"},
"vm4": {"CPUS": 1, "memory": 1G, "status":
"running"},
"vm5": {"CPUS": 1, "memory": 1G, "status":
"running"},
]
the network topology is net2.keys()
But we will know the network is not a VM's attribute, it is just a VM's
interface kind.
>
>> 'autostart': self.info['autostart'],
>> 'connection': self.info['connection'],
>> 'interface': self.info['interface'],
>> diff --git a/src/kimchi/model.py b/src/kimchi/model.py
>> index a21fcf7..3e61390 100644
>> --- a/src/kimchi/model.py
>> +++ b/src/kimchi/model.py
>> @@ -547,6 +547,11 @@ class Model(object):
>> xpath =
"/domain/devices/disk[@device='disk']/source/@file"
>> return xmlutils.xpath_get_text(xml, xpath)
>>
>> + def _vm_get_networks(self, dom):
>> + xml = dom.XMLDesc(0)
>> + xpath =
>> "/domain/devices/interface[@type='network']/source/@network"
>> + return xmlutils.xpath_get_text(xml, xpath)
>> +
>> def vm_delete(self, name):
>> if self._vm_exists(name):
>> conn = self.conn.get()
>> @@ -859,6 +864,15 @@ class Model(object):
>> conn = self.conn.get()
>> return sorted(conn.listNetworks() +
>> conn.listDefinedNetworks())
>>
>> + def _get_vms_attach_to_a_network(self, network):
>> + vms = []
>> + conn = self.conn.get()
>> + for dom in conn.listAllDomains(0):
>> + networks = self._vm_get_networks(dom)
>> + if network in networks:
>> + vms.append(dom.name())
>> + return vms
>> +
>> def network_lookup(self, name):
>> network = self._get_network(name)
>> xml = network.XMLDesc(0)
>> @@ -887,6 +901,7 @@ class Model(object):
>> 'interface': interface,
>> 'subnet': subnet,
>> 'dhcp': dhcp,
>> + 'vms': self._get_vms_attach_to_a_network(name),
>> 'autostart': network.autostart() == 1,
>> 'state': network.isActive() and "active" or
>> "inactive"}
>>
>
> _______________________________________________
> Kimchi-devel mailing list
> Kimchi-devel(a)ovirt.org
>
http://lists.ovirt.org/mailman/listinfo/kimchi-devel
--
Thanks and best regards!
Sheldon Feng(冯少合)<shaohef(a)linux.vnet.ibm.com>
IBM Linux Technology Center