summaryrefslogtreecommitdiff
path: root/cpp/src/IcePack/ServerDeployerI.cpp
blob: fd4613f23a580b567c5988ee63890fc92974e4fe (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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
// **********************************************************************
//
// Copyright (c) 2003 - 2004
// ZeroC, Inc.
// North Palm Beach, FL, USA
//
// All Rights Reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************


#include <Ice/Ice.h>
#include <IcePack/ServerDeployerI.h>
#include <IcePack/ServerFactory.h>
#include <IcePack/ServerBuilder.h>
#include <IcePack/TraceLevels.h>

using namespace std;
using namespace IcePack;

IcePack::ServerDeployerI::ServerDeployerI(const NodeInfoPtr& nodeInfo) :
    _nodeInfo(nodeInfo)
{
}

IcePack::ServerDeployerI::~ServerDeployerI()
{
}

void
IcePack::ServerDeployerI::add(const string& name, const string& descriptor, const string& binPath, 
			      const string& libPath, const Ice::StringSeq& targets, const Ice::Current&)
{
    //
    // Setup required variables.
    //
    map<string, string> variables;
    variables["parent"] = _nodeInfo->getNode()->getName();
    variables["name"] = name;
    variables["fqn"] = _nodeInfo->getNode()->getName() + "." + name;
    variables["binpath"] = binPath;
    variables["libpath"] = libPath;

    string dataDir = _nodeInfo->getCommunicator()->getProperties()->getProperty("IcePack.Node.Data");
    variables["datadir"] = dataDir + (dataDir[dataDir.length() - 1] == '/' ? "" : "/") + "servers/" + name;

    ServerBuilder builder(_nodeInfo, variables, targets);

    //
    // Parse the server deployment descriptors.
    //
    builder.parse(descriptor);

    //
    // Execute the builder tasks.
    //
    builder.execute();
}

void
IcePack::ServerDeployerI::remove(const string& name, const Ice::Current&)
{
    ServerRegistryPrx registry = _nodeInfo->getServerRegistry();

    //
    // Component path is used to identify the component. For example:
    // node1.server1.service3
    //
    string componentPath = _nodeInfo->getNode()->getName() + "." + name;

    ServerPrx server;
    try
    {
	server = registry->findByName(name);
    }
    catch(const ServerNotExistException&)
    {
	ServerDeploymentException ex;
	ex.server = name;
	ex.reason = "server doesn't exist";
	ex.component = componentPath;
	throw ex;
    }

    
    ServerDescription desc;
    try
    {
	desc = server->getServerDescription();
    }
    catch(const Ice::ObjectNotExistException&)
    {
	ServerDeploymentException ex;
	ex.server = name;
	ex.reason = "server doesn't exist";
	ex.component = componentPath;
	throw ex;
    }

    //
    // Ensure the server is from this node.
    //
    if(desc.node != _nodeInfo->getNode()->getName())
    {
	ServerDeploymentException ex;
	ex.server = name;
	ex.reason = "server is not managed by this node";
	ex.component = componentPath;
	throw ex;
    }

    map<string, string> variables;
    variables["parent"] = _nodeInfo->getNode()->getName();
    variables["name"] = name;
    variables["fqn"] = _nodeInfo->getNode()->getName() + "." + name;
    variables["binpath"] = desc.path;
    variables["libpath"] = "";

    string dataDir = _nodeInfo->getCommunicator()->getProperties()->getProperty("IcePack.Node.Data");
    variables["datadir"] = dataDir + (dataDir[dataDir.length() - 1] == '/' ? "" : "/") + "servers/" + name;

    ServerBuilder builder(_nodeInfo, variables, desc.targets);

    //
    // Parse the server deployment descriptors.
    //
    builder.parse(desc.descriptor);

    //
    // Execute the builder tasks.
    //
    builder.undo();
}