[Et-mgmt-commits-list] [SCM] virt-factory branch, master now at v0.0.3-142-gb4d895f

Scott Seago sseago at redhat.com
Wed Aug 8 19:18:45 UTC 2007


Hello,

This is an automated email from the git hooks/update script, it was
generated because a ref change was pushed to the repository.

Updating branch, master,
       via  b4d895fe439856ba81d25d6ab5f4b37d2532ef41 (commit)
       via  9635b813e01399db235e6c66d4358645a1bc9f91 (commit)
       via  52abd05e9b96dcd7b334012ffada54576b64171b (commit)
      from  2f1fc4d1beea0beeba5557118ad8fedd42a94fc2 (commit)

- Log -----------------------------------------------------------------
commit b4d895fe439856ba81d25d6ab5f4b37d2532ef41
Merge: 9635b81... 2f1fc4d...
Author: Scott Seago <sseago at redhat.com>
Date:   Wed Aug 8 13:32:11 2007 -0400

    Merge with git+ssh://g-sseago@et.redhat.com/git/virt-factory

commit 9635b813e01399db235e6c66d4358645a1bc9f91
Author: Scott Seago <sseago at redhat.com>
Date:   Wed Aug 8 13:29:28 2007 -0400

    removed requirement for additional bridge server. vf_node_server no longer
    requires virt-factory-server to be running (although qpidd on the server
    must be)

commit 52abd05e9b96dcd7b334012ffada54576b64171b
Author: Scott Seago <sseago at redhat.com>
Date:   Wed Aug 8 13:20:49 2007 -0400

    more fixes to get_profile_choices and related WUI code
-----------------------------------------------------------------------

Diffstat:
 common/busrpc/busrpc/bridge.py                |    7 +---
 common/busrpc/busrpc/qpid_transport.py        |   27 +++++++++++++--
 common/busrpc/busrpc/qpid_util.py             |   19 ++++++----
 common/busrpc/busrpc/rpc.py                   |   22 ++++++++----
 common/busrpc/busrpc/services.py              |   13 +++++--
 nodes/nodes/server.py                         |    5 +--
 nodes/qpid.conf                               |    2 +-
 register/register/register.py                 |    2 +-
 service/init-scripts/virt-factory-server      |    1 -
 service/modules/machine.py                    |   35 +++++++++++-------
 service/modules/nodecomm.py                   |    2 +-
 service/qpid.conf                             |    2 +-
 service/server/server.py                      |   47 +++++++++---------------
 wui/src/app/controllers/machine_controller.rb |    2 +-
 wui/src/app/views/machine/edit.rhtml          |    2 +-
 15 files changed, 110 insertions(+), 78 deletions(-)

diff --git a/common/busrpc/busrpc/bridge.py b/common/busrpc/busrpc/bridge.py
index 155c60f..f5784e9 100644
--- a/common/busrpc/busrpc/bridge.py
+++ b/common/busrpc/busrpc/bridge.py
@@ -90,10 +90,7 @@ class Bridge(object):
                         server = reg_server
                         hostname = host
                         break
-        if not hostname == None and not server == None:
-            return hostname + "!" + server + "!" + service
-        else:
-            return None
+        return get_handle(service, hostname, server)
                 
     def _verify_registration(service_name):
         try:
@@ -105,7 +102,7 @@ class Bridge(object):
                 return False
         finally:
             self.registration_lock.release()
-
+            
 def start_bridge(config_path):
     config = DeploymentConfig(config_path)
     dispatcher = RPCDispatcher(config, register_with_bridge=False)
diff --git a/common/busrpc/busrpc/qpid_transport.py b/common/busrpc/busrpc/qpid_transport.py
index 48ebd48..6033e1e 100644
--- a/common/busrpc/busrpc/qpid_transport.py
+++ b/common/busrpc/busrpc/qpid_transport.py
@@ -116,6 +116,9 @@ class QpidServerTransport(QpidTransport, ServerTransport):
         self.callback = None
         self.max_workers = workers
         self.is_stopped = False
+        self.closing_lock = threading.RLock()
+        self.poll_done = False
+        self.write_done = False
         self.pending_calls = qpid.queue.Queue()
         self.pending_sends = qpid.queue.Queue()
         QpidTransport.__init__(self, host, port, user, password, vhost)
@@ -134,6 +137,13 @@ class QpidServerTransport(QpidTransport, ServerTransport):
     def stop(self):
         self.is_stopped = True
 
+    def shutdown_if_done(self):
+        # delete queues
+        # delete exchanges
+        if (self.poll_done and self.write_done):
+            qpid_util.delete_queue(self, queue_name=self.queue_name)
+            #qpid_util.delete_exchange(self, exchange_name=self.exchange_name)
+
     def send_message(self, to, message):
         self.pending_sends.put((to, message))
 
@@ -143,10 +153,16 @@ class QpidServerTransport(QpidTransport, ServerTransport):
     def _write(self):
         while not self.is_stopped:
             try:
-                to, message = self.pending_sends.get(timeout = 30)
+                to, message = self.pending_sends.get(timeout=15)
                 QpidTransport.send_message(self, to, message)
             except qpid.queue.Empty:
                 pass
+        try:
+            self.closing_lock.acquire()
+            self.write_done = True
+            self.shutdown_if_done()
+        finally:
+            self.closing_lock.release()
 
     def _dispatch(self):
         while not self.is_stopped:
@@ -157,14 +173,19 @@ class QpidServerTransport(QpidTransport, ServerTransport):
                     self.send_message(addr, reply)
             except TypeError, e:
                 print e
-                
 
     def _poll(self):
         while not self.is_stopped:
             try:
-                msg = self.incoming_queue.get(timeout=30)
+                msg = self.incoming_queue.get(timeout=15)
                 qpid_util.ack_message(self, message=msg)                
                 self.pending_calls.put(msg.content.body)
             except qpid.queue.Empty:
                 pass
 
+        try:
+            self.closing_lock.acquire()
+            self.poll_done = True
+            self.shutdown_if_done()
+        finally:
+            self.closing_lock.release()
diff --git a/common/busrpc/busrpc/qpid_util.py b/common/busrpc/busrpc/qpid_util.py
index 92f9c80..f13024c 100644
--- a/common/busrpc/busrpc/qpid_util.py
+++ b/common/busrpc/busrpc/qpid_util.py
@@ -10,21 +10,20 @@ def declare_exchange(caller, channel_id=1,exchange_name='',
                      create=False, auto_remove=False,
                      exchange_type='direct'):
     channel = caller.channel(channel_id)
-    create = not create
     channel.exchange_declare(exchange=exchange_name, type=exchange_type,
-                                 passive=create, auto_delete=auto_remove)
+                                 passive=not create, auto_delete=auto_remove)
+
+def delete_exchange(caller, channel_id=1,exchange_name=''):
+    channel = caller.channel(channel_id)
+    channel.exchange_delete(exchange=exchange_name)
 
 def declare_queue(caller, channel_id=1, queue_name='',
                   create=False, auto_remove=False,
                   exclusive_use=False):
     channel = caller.channel(channel_id)
-    create = not create
-    msg = channel.queue_declare(queue=queue_name, passive=create,
+    msg = channel.queue_declare(queue=queue_name, passive=not create,
                                 exclusive=exclusive_use, auto_delete=auto_remove)
-    if not msg == None and len(msg.frame.args) > 0:
-        return msg.frame.args[0]
-    else:
-        return None
+    return msg.queue
         
 def bind_queue(caller, channel_id=1, queue_name='',
                exchange_name='', routing_key_name=''):
@@ -32,6 +31,10 @@ def bind_queue(caller, channel_id=1, queue_name='',
     channel.queue_bind(queue=queue_name, exchange=exchange_name,
                        routing_key=routing_key_name)
 
+def delete_queue(caller, channel_id=1,queue_name=''):
+    channel = caller.channel(channel_id)
+    channel.queue_delete(queue=queue_name)
+
 def register_consumer(caller, channel_id=1, queue_name='', exclusive_use=False, ack=True):
     channel = caller.channel(channel_id)
     reply = channel.basic_consume(queue=queue_name, exclusive=exclusive_use,
diff --git a/common/busrpc/busrpc/rpc.py b/common/busrpc/busrpc/rpc.py
index 0c057c1..5078329 100644
--- a/common/busrpc/busrpc/rpc.py
+++ b/common/busrpc/busrpc/rpc.py
@@ -107,17 +107,25 @@ def build_proxy(service_handle, transport, cert_mgr=None):
     hostname, server, service = service_handle.split('!')
     return RPCProxy(hostname + "!" + server, service, transport, cert_mgr=cert_mgr)
 
-def lookup_service(name, transport, cert_mgr=None, host=None):
+def lookup_service(name, transport, cert_mgr=None, host=None, server_name = None, use_bridge=False):
     if transport == None:
         transport = qpid_transport.QpidTransport()
         transport.connect()
-    bridge = busrpc.rpc.RPCProxy("busrpc.Bridge", "bridge", transport, cert_mgr=cert_mgr)
     retval = None
-    if name == "bridge":
-        retval = bridge
-    else:
+    if use_bridge:
+        bridge = busrpc.rpc.RPCProxy("busrpc.Bridge", "bridge", transport, cert_mgr=cert_mgr)
+        if name == "bridge":
+            return bridge
         service_handle = bridge.lookup_service(name, host)
-        if not service_handle == None:
-            retval = build_proxy(service_handle, transport, cert_mgr=cert_mgr)
+    else:
+        service_handle = get_handle(name, host, server_name)
+        
+    if not service_handle == None:
+        retval = build_proxy(service_handle, transport, cert_mgr=cert_mgr)
     return retval
     
+def get_handle(service, hostname, server):
+    if not hostname == None and not server == None:
+        return hostname + "!" + server + "!" + service
+    else:
+        return None
diff --git a/common/busrpc/busrpc/services.py b/common/busrpc/busrpc/services.py
index f8a8e76..4367a9d 100644
--- a/common/busrpc/busrpc/services.py
+++ b/common/busrpc/busrpc/services.py
@@ -28,7 +28,11 @@ def _create_instance(config, full_class_name):
 
 class RPCDispatcher(object):
 
-    def __init__(self, config, register_with_bridge = True, server_host = None):
+    def __init__(self, config, register_with_bridge = True, server_host = None, is_bridge_server=None):
+        if is_bridge_server == None:
+            self.is_bridge_server=not register_with_bridge
+        else:
+            self.is_bridge_server = is_bridge_server
         self.instances = {}
         self.hostname = socket.gethostname()
         if (server_host == None):
@@ -38,7 +42,7 @@ class RPCDispatcher(object):
         self.name = config.server_name
         certdir = config.get_value('busrpc.crypto.certdir')
         pwd = config.get_value('busrpc.crypto.password')
-        if register_with_bridge:
+        if not self.is_bridge_server:
             self.transport = busrpc.qpid_transport.QpidServerTransport(self.hostname + "!" + self.name, host=self.server_host)
         else:
             self.transport = busrpc.qpid_transport.QpidServerTransport(self.name, host=self.server_host)
@@ -48,7 +52,10 @@ class RPCDispatcher(object):
         self.instance_method_cache = {}
         self.cert_mgr = CertManager(certdir, self.hostname)
         self.client_transport = self.transport.clone()
-        self.bridge = busrpc.rpc.lookup_service('bridge', self.client_transport, cert_mgr=self.cert_mgr)
+        if register_with_bridge:
+            self.bridge = busrpc.rpc.lookup_service('bridge', self.client_transport, cert_mgr=self.cert_mgr)
+        else:
+            self.bridge = None
         for name in config.instances.iterkeys():
             instance = config.instances[name]
             self.add_instance(name, _create_instance(config, instance))
diff --git a/nodes/nodes/server.py b/nodes/nodes/server.py
index dc0f432..a63be37 100755
--- a/nodes/nodes/server.py
+++ b/nodes/nodes/server.py
@@ -152,7 +152,7 @@ def serve_qpid(config_path):
      server_file = open("/etc/sysconfig/virt-factory/server","r")
      server_host = server_file.read()
      server_file.close()
-     dispatcher = RPCDispatcher(config, server_host=server_host)
+     dispatcher = RPCDispatcher(config, server_host=server_host, register_with_bridge=False, is_bridge_server=False)
      
      try:
          dispatcher.start()
@@ -170,10 +170,9 @@ def main(argv):
      
     if "--daemon" in sys.argv:
         utils.daemonize("/var/run/vf_node_server.pid")
-        serve_qpid("/etc/virt-factory-nodes/qpid.conf")
     else:
         print _("serving...\n")
-        serve_qpid("/etc/virt-factory-nodes/qpid.conf")
+    serve_qpid("/etc/virt-factory-nodes/qpid.conf")
 
 
 if __name__ == "__main__":
diff --git a/nodes/qpid.conf b/nodes/qpid.conf
index c2816a0..2800459 100644
--- a/nodes/qpid.conf
+++ b/nodes/qpid.conf
@@ -1,5 +1,5 @@
 busrpc.server.host=localhost
-busrpc.server.name=com.redhat.busrpc.Server
+busrpc.server.name=busrpc.nodes
 busrpc.instance.nodes=nodes.server.BusRpcWrapper
 busrpc.crypto.password=foo
 busrpc.crypto.certdir=/var/lib/virt-factory/qpidcert
diff --git a/register/register/register.py b/register/register/register.py
index f471335..773283c 100755
--- a/register/register/register.py
+++ b/register/register/register.py
@@ -46,7 +46,7 @@ class Server:
         #cm = CertManager('/var/lib/virt-factory/qpidcert', client)
         cm = None
     
-        self.rpc_interface = lookup_service("rpc", transport, host=host, cert_mgr=cm)
+        self.rpc_interface = lookup_service("rpc", transport, host=host, server_name="busrpc.virt-factory", cert_mgr=cm, use_bridge=False)
         if self.rpc_interface == None:
             print "Lookup failed :("
             sys.exit(-1)    
diff --git a/service/init-scripts/virt-factory-server b/service/init-scripts/virt-factory-server
index bec5772..3775c06 100755
--- a/service/init-scripts/virt-factory-server
+++ b/service/init-scripts/virt-factory-server
@@ -29,7 +29,6 @@ start() {
         sudo -u postgres /usr/bin/vf_create_db --replace 
     fi 
     /usr/bin/vf_server --daemon
-    /usr/bin/vf_server bridge --daemon
     /usr/bin/vf_server qpid --daemon
     /usr/bin/vf_taskatron --daemon
     RETVAL=$?
diff --git a/service/modules/machine.py b/service/modules/machine.py
index 4b09ab9..0f27849 100755
--- a/service/modules/machine.py
+++ b/service/modules/machine.py
@@ -244,28 +244,36 @@ class Machine(web_svc.AuthWebSvc):
         this_object = self.get(token,{ "id" : args["id" ] })
         this_object = this_object.data
 
-        # the WUI should filter this out but lets be safe anyway
-        if this_object["is_container"] != codes.MACHINE_IS_CONTAINER:
-            # cannot install any virt types on this machine
+        try:
+            # the WUI should filter this out but lets be safe anyway
+            if this_object["is_container"] != codes.MACHINE_IS_CONTAINER:
+                # cannot install any virt types on this machine
+                return codes.success([])
+
+            need_virt = this_object["profile"]["virt_type"]
+            need_arch = this_object["profile"]["distribution"]["architecture"]
+        except KeyError, e:
+            #missing distribution or profile, for now return empty list rather than error
+            print "missing distribution or profile, for now return empty list rather than error", e
+            print "machine: ", this_object
             return codes.success([])
 
-        session = db.open_session()
-        offset, limit = self.offset_and_limit(args)
-        
-        need_arch = this_object["distribution"]["arch"]
-        need_virt = this_object["profile"]["virt_type"]
-
         # find all profiles with matching virt types and matching arches
         # matching distros is not important.
         try:
+            session = db.open_session()
+            offset, limit = self.offset_and_limit(args)        
+            
             query = session.query(db.Profile).offset(offset).limit(limit)
             results = []
             # FIXME: make efficient .. want to send raw SQL to sqlalchemy
             # to do fancy joins
             for result in query.select():
-                if result.arch == need_arch and result.virt_type == need_virt:
-                    obj = profile.get(token, { "id" : result.id })
-                    results.append(obj.expand())
+                print "trying", result
+                if result.distribution.architecture == need_arch and result.virt_type == need_virt:
+                    obj = profile.Profile().get(token, { "id" : result.id })
+                    print "found", obj
+                    results.append(obj.data)
             return codes.success(results)
         finally:
             session.close()
@@ -340,7 +348,7 @@ class Machine(web_svc.AuthWebSvc):
         try:
             self.logger.info(args)
             machine = db.Machine.get(session, args['id'])
-            return codes.success(machine.get_hash())
+            return codes.success(self.expand(machine))
         finally:
             session.close()
 
@@ -359,6 +367,7 @@ class Machine(web_svc.AuthWebSvc):
     def expand(self, machine):
         result = machine.get_hash()
         result['profile'] = machine.profile.get_hash()
+        result['profile']['distribution'] = machine.profile.distribution.get_hash()
         return result
 
 
diff --git a/service/modules/nodecomm.py b/service/modules/nodecomm.py
index 027b997..0b8935d 100755
--- a/service/modules/nodecomm.py
+++ b/service/modules/nodecomm.py
@@ -32,7 +32,7 @@ class Server:
         #cm = CertManager('/var/lib/virt-factory/qpidcert', client)
         cm = None
     
-        self.rpc_interface = lookup_service("nodes", transport, host=node, cert_mgr=cm)
+        self.rpc_interface = lookup_service("nodes", transport, host=node, server_name="busrpc.nodes", cert_mgr=cm, use_bridge=False)
         if self.rpc_interface == None:
             print "Lookup failed :("
             sys.exit(-1)    
diff --git a/service/qpid.conf b/service/qpid.conf
index 6128e47..b0c8ad0 100644
--- a/service/qpid.conf
+++ b/service/qpid.conf
@@ -1,5 +1,5 @@
 busrpc.server.host=localhost
-busrpc.server.name=com.redhat.busrpc.Server
+busrpc.server.name=busrpc.virt-factory
 busrpc.instance.rpc=server.server.BusRpcWrapper
 busrpc.crypto.password=foo
 busrpc.crypto.certdir=/var/lib/virt-factory/qpidcert
diff --git a/service/server/server.py b/service/server/server.py
index 626e4cf..8c4e182 100755
--- a/service/server/server.py
+++ b/service/server/server.py
@@ -184,12 +184,12 @@ def serve(websvc):
      server.register_instance(websvc)
      server.serve_forever()
 
-def serve_qpid(config_path, register_with_bridge=True):
+def serve_qpid(config_path, register_with_bridge=False, is_bridge_server=False):
      """
      Code for starting the QPID RPC service. 
      """
      config = DeploymentConfig(config_path)
-     dispatcher = RPCDispatcher(config, register_with_bridge)
+     dispatcher = RPCDispatcher(config, register_with_bridge, is_bridge_server=is_bridge_server)
      
      try:
          dispatcher.start()
@@ -207,41 +207,30 @@ def main(argv):
     Start things up.
     """
 
-    if "bridge" in sys.argv or "--bridge" in sys.argv:
+    websvc = XmlRpcInterface()
+
+    for arg in sys.argv:
+        if arg == "import" or arg == "--import":
+            prov_obj = provisioning.Provisioning()
+            prov_obj.init(None, {})
+            return
+        elif arg == "sync" or arg == "--sync":
+            prov_obj = provisioning.Provisioning()
+            prov_obj.sync(None, {}) # just for testing
+            return
+    if "qpid" in sys.argv or "--qpid" in sys.argv:
         if "daemon" in sys.argv or "--daemon" in sys.argv:
-            utils.daemonize("/var/run/vf_server_bridge.pid")
-            serve_qpid("/etc/virt-factory/qpid-bridge.conf", register_with_bridge=False)
+            utils.daemonize("/var/run/vf_server_qpid.pid")
         else:
             print "serving...\n"
-            # daemonize only if --daemonize, because I forget to type "debug" -- MPD
-            serve_qpid("/etc/virt-factory/qpid-bridge.conf", register_with_bridge=False)
+        serve_qpid("/etc/virt-factory/qpid.conf")
     else:
-        websvc = XmlRpcInterface()
-    
-        for arg in sys.argv:
-            if arg == "import" or arg == "--import":
-                prov_obj = provisioning.Provisioning()
-                prov_obj.init(None, {})
-                return
-            elif arg == "sync" or arg == "--sync":
-                prov_obj = provisioning.Provisioning()
-                prov_obj.sync(None, {}) # just for testing
-                return
-        if "qpid" in sys.argv or "--qpid" in sys.argv:
-            if "daemon" in sys.argv or "--daemon" in sys.argv:
-                utils.daemonize("/var/run/vf_server_qpid.pid")
-                serve_qpid("/etc/virt-factory/qpid.conf")
-            else:
-                print "serving...\n"
-                # daemonize only if --daemonize, because I forget to type "debug" -- MPD
-                serve_qpid("/etc/virt-factory/qpid.conf")
-        elif "daemon" in sys.argv or "--daemon" in sys.argv:
+        if "daemon" in sys.argv or "--daemon" in sys.argv:
             utils.daemonize("/var/run/vf_server.pid")
-            serve(websvc)
         else:
             print "serving...\n"
             # daemonize only if --daemonize, because I forget to type "debug" -- MPD
-            serve(websvc)
+        serve(websvc)
        
 # FIXME: upgrades?  database upgrade logic would be nice to have here, as would general creation (?)
 # FIXME: command line way to add a distro would be nice to have in the future, rsync import is a bit heavy handed.
diff --git a/wui/src/app/controllers/machine_controller.rb b/wui/src/app/controllers/machine_controller.rb
index 4acd027..3d71156 100755
--- a/wui/src/app/controllers/machine_controller.rb
+++ b/wui/src/app/controllers/machine_controller.rb
@@ -10,7 +10,7 @@ class MachineController < AbstractObjectController
         if !params[:id].nil?
             obj = ManagedObject.retrieve(Machine, get_login, params[:id])
             # obj.refresh() -- do not call this from WUI (at least for now)
-            @profile_choices = obj.get_profile_choices()
+          @profile_choices = obj.get_profile_choices().collect { |x| x["name"] }
         end
 
 
diff --git a/wui/src/app/views/machine/edit.rhtml b/wui/src/app/views/machine/edit.rhtml
index ad423ac..366b5c1 100755
--- a/wui/src/app/views/machine/edit.rhtml
+++ b/wui/src/app/views/machine/edit.rhtml
@@ -83,6 +83,6 @@
 
       </div>
 
- at profile_choices
+Profile choices: <%= @profile_choices %>
 
 

hooks/update
---
Git Source Code Management System
hooks/update refs/heads/master \
  2f1fc4d1beea0beeba5557118ad8fedd42a94fc2 \
  b4d895fe439856ba81d25d6ab5f4b37d2532ef41




More information about the Et-mgmt-commits-list mailing list