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@linux.vnet.ibm.com wrote:
From: ShaoHe Feng <shaohef@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@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@ovirt.org
http://lists.ovirt.org/mailman/listinfo/kimchi-devel





-- 
Thanks and best regards!

Sheldon Feng(冯少合)<shaohef@linux.vnet.ibm.com>
IBM Linux Technology Center