Ignore:
Timestamp:
Nov 30, 2011 5:55:13 PM (12 years ago)
Author:
Ted Faber <faber@…>
Branches:
compt_changes, info-ops, master
Children:
f671ef7
Parents:
b709861
Message:

Reload interface works

File:
1 edited

Legend:

Unmodified
Added
Removed
  • fedd/federation/emulab_segment.py

    rb709861 r1ae1aa2  
    33import logging
    44import util
     5import topdl
    56
    67from M2Crypto import SSL
     
    1718
    1819class emulab_segment:
     20    class node_info:
     21        def __init__(self, name, pname, status=None, osname=None,
     22                osversion=None, image=None):
     23            self.name = name
     24            self.pname = pname
     25            self.status = status
     26            self.osname = osname
     27            self.osversion = osversion
     28            self.image = image
     29        def getOS(self):
     30            rv = None
     31            if self.osname or self.osversion:
     32                rv = topdl.OperatingSystem(name=self.osname,
     33                        version=self.osversion)
     34            if self.image and rv:
     35                rv.set_attribute('image', self.image)
     36            return rv
     37
    1938    def __init__(self, boss, cert):
    2039        self.ctxt = fedd_ssl_context(my_cert=cert)
     
    3453        self.node = { }
    3554        self.status = [ ]
     55        self.node_info = emulab_segment.node_info
    3656
    3757    def emulab_call(self, method, params):
     
    207227            return code == 0
    208228
     229    def get_osid_map(self):
     230        oses = { }
     231        code, osids = self.emulab_call('osid.getlist', {})
     232        for key, val in osids.items():
     233            val['imageid'] = key
     234            oses[val['osid']] = val
     235        return oses
    209236
    210237    def get_mapping(self, pid, eid):
     
    223250            if self.log:
    224251                self.log.info("[get_mapping] Generating mapping")
     252
     253            osidmap = self.get_osid_map()
    225254
    226255            params = {
     
    235264                        st = v.get('status', 'up')
    236265                        ev = v.get('eventstatus', 'ISUP')
     266                        os = v.get('osid', None)
    237267
    238268                        if st == 'up' and ev in ev_ok: st = 'active'
    239269                        else: st = 'failed'
    240                         self.node[k] = (v['pnode'], st)
     270
     271                        if os and os in osidmap:
     272                           osname = osidmap[os].get('OS', None)
     273                           osversion = osidmap[os].get('version', None)
     274                           osimage = "%s/%s" % \
     275                                   ( osidmap[os].get('pid', ''),
     276                                           osidmap[os].get('imageid', ''))
     277                        else:
     278                            osname = osversion = osimage = None
     279
     280                        self.node[k] = self.node_info(k, v['pnode'], st,
     281                                osname, osversion, osimage)
    241282                if self.log:
    242283                    self.log.info("Mapping complete")
     
    245286                raise service_error(service_error.internal,
    246287                        "Cannot get node mapping of segment:%s/%s" % (pid, eid))
    247 
    248     def do_operation(self, op, lnode, pnode, params):
     288    def get_image(self, node, top):
     289        for e in top.elements:
     290            if isinstance(e, topdl.Computer):
     291                if node == e.name:
     292                    if e.os:
     293                        return e.os[0].get_attribute('image')
     294        return None
     295
     296
     297    def do_operation(self, op, lnode, pnode, params, top):
    249298        """
    250299        Carry out operation on node in the given experiment.
     
    268317                return False
    269318            elif state == 'initial':
    270                 self.status.append(operation_status(lnode,
    271                         operation_status.unsupp, 'Image load unsupported'))
    272                 return False
     319                image = self.get_image(lnode, top)
     320                if image:
     321                    pid, iid = image.split('/')
     322                    p = {'nodes': pnode, 'imagename': iid, 'imageproj': pid,
     323                            'wait': False}
     324                    code, result = self.emulab_call('node.reload', p)
     325                    if code == 0:
     326                        self.status.append(operation_status(lnode,
     327                            operation_status.success, 'reloading'))
     328                        return True
     329                    else:
     330                        self.status.append(operation_status(lnode,
     331                                operation_status.federant,
     332                                'Error code: %d' % code))
     333                        return False
     334                else:
     335                    self.status.append(operation_status(lnode,
     336                            operation_status.federant,
     337                            'cannot find imageid??'))
     338                    return False
    273339            elif state == 'boot':
    274340                p = {'nodes': pnode, 'wait': False}
Note: See TracChangeset for help on using the changeset viewer.