[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