aboutsummaryrefslogtreecommitdiffstats
path: root/tools/xen/lib/xend/XendMigrate.py
blob: 1580ba83ed7508891ddfea6640a45fa2a2e7fcf9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# Copyright (C) 2004 Mike Wray <mike.wray@hp.com>

import sys
import socket

import sxp
import XendDB
import EventServer; eserver = EventServer.instance()

class XendMigrateInfo:

    # states: begin, active, failed, succeeded?

    def __init__(self, id, dom, dst):
        self.id = id
        self.state = 'begin'
        self.src_host = socket.gethostname()
        self.src_dom = dom
        self.dst_host = dst
        self.dst_dom = None
        
    def set_state(self, state):
        self.state = state

    def get_state(self):
        return self.state

    def sxpr(self):
        sxpr = ['migrate', ['id', self.id], ['state', self.state] ]
        sxpr_src = ['src', ['host', self.src_host], ['domain', self.src_dom] ]
        sxpr.append(sxpr_src)
        sxpr_dst = ['dst', ['host', self.dst] ]
        if self.dst_dom:
            sxpr_dst.append(['domain', self.dst_dom])
        sxpr.append(sxpr_dst)
        return sxpr
    

class XendMigrate:
    # Represents migration in progress.
    # Use log for indications of begin/end/errors?
    # Need logging of: domain create/halt, migrate begin/end/fail
    # Log via event server?

    dbpath = "migrate"
    
    def __init__(self):
        self.db = XendDB.XendDB(self.dbpath)
        self.migrate = {}
        self.migrate_db = self.db.fetchall("")
        self.id = 0

    def nextid(self):
        self.id += 1
        return "%d" % self.id

    def sync(self):
        self.db.saveall("", self.migrate_db)

    def sync_migrate(self, id):
        self.db.save(id, self.migrate_db[id])

    def close(self):
        pass

    def _add_migrate(self, id, info):
        self.migrate[id] = info
        self.migrate_db[id] = info.sxpr()
        self.sync_migrate(id)
        #eserver.inject('xend.migrate.begin', info.sxpr())

    def _delete_migrate(self, id):
        #eserver.inject('xend.migrate.end', id)
        del self.migrate[id]
        del self.migrate_db[id]
        self.db.delete(id)

    def migrate_ls(self):
        return self.migrate.keys()

    def migrates(self):
        return self.migrate.values()

    def migrate_get(self, id):
        return self.migrate.get(id)
    
    def migrate_begin(self, dom, dst):
        # Check dom for existence, not migrating already.
        # Create migrate info, tell xend to migrate it?
        # - or fork migrate command ourselves?
        # Subscribe to migrate notifications (for updating).
        id = self.nextid()
        info = XenMigrateInfo(id, dom, dst)
        self._add_migrate(id, info)
        return id

def instance():
    global inst
    try:
        inst
    except:
        inst = XendMigrate()
    return inst