1 //
2 // Copyright (c) ZeroC, Inc. All rights reserved.
3 //
4
5 #include <Ice/Ice.h>
6 #include <IceGrid/IceGrid.h>
7
8 #include <TestHelper.h>
9
10 using namespace std;
11 using namespace IceGrid;
12
13 namespace
14 {
15
16 class RegistryPluginI : public Ice::Plugin
17 {
18 public:
19
20 RegistryPluginI(const Ice::CommunicatorPtr&);
21
22 virtual void initialize();
23 virtual void destroy();
24
25 private:
26
27 const Ice::CommunicatorPtr _communicator;
28 ReplicaGroupFilterPtr _filterByServer;
29 ReplicaGroupFilterPtr _excludeServer2;
30 ReplicaGroupFilterPtr _excludeServer3;
31 TypeFilterPtr _type;
32 };
33
34 class ReplicaGroupFilterI : public IceGrid::ReplicaGroupFilter
35 {
36 public:
37
ReplicaGroupFilterI(const RegistryPluginFacadePtr & facade)38 ReplicaGroupFilterI(const RegistryPluginFacadePtr& facade) : _facade(facade), _testFacade(true)
39 {
40 }
41
42 virtual Ice::StringSeq
filter(const string & id,const Ice::StringSeq & adpts,const Ice::ConnectionPtr &,const Ice::Context & ctx)43 filter(const string& id, const Ice::StringSeq& adpts, const Ice::ConnectionPtr&, const Ice::Context& ctx)
44 {
45 if(_testFacade)
46 {
47 _testFacade = false; // Only test once.
48 for(Ice::StringSeq::const_iterator p = adpts.begin(); p != adpts.end(); ++p)
49 {
50 try
51 {
52 test(_facade->getApplicationInfo(_facade->getAdapterApplication(*p)).descriptor.name == "Test");
53 test(_facade->getServerInfo(_facade->getAdapterServer(*p)).application == "Test");
54 test(_facade->getNodeInfo(_facade->getAdapterNode(*p)).name == "localnode");
55 #ifndef _AIX
56 // On AIX, icegridnode needs read permissions on /dev/kmem
57 test(_facade->getNodeLoad(_facade->getAdapterNode(*p)).avg1 >= 0.0);
58 #endif
59 test(_facade->getAdapterInfo(*p)[0].replicaGroupId == id);
60 test(_facade->getPropertyForAdapter(*p, "Identity") == id);
61 }
62 catch(const Ice::Exception& ex)
63 {
64 cerr << ex << endl;
65 test(false);
66 }
67 }
68 }
69
70 Ice::Context::const_iterator p = ctx.find("server");
71 if(p == ctx.end())
72 {
73 return adpts;
74 }
75
76 string server = p->second;
77 Ice::StringSeq filteredAdapters;
78 for(Ice::StringSeq::const_iterator q = adpts.begin(); q != adpts.end(); ++q)
79 {
80 if(_facade->getAdapterServer(*q) == server)
81 {
82 filteredAdapters.push_back(*q);
83 }
84 }
85 return filteredAdapters;
86 }
87
88 private:
89
90 RegistryPluginFacadePtr _facade;
91 bool _testFacade;
92 };
93
94 class TypeFilterI : public IceGrid::TypeFilter
95 {
96 public:
97
TypeFilterI(const RegistryPluginFacadePtr & facade)98 TypeFilterI(const RegistryPluginFacadePtr& facade) : _facade(facade)
99 {
100 }
101
102 virtual Ice::ObjectProxySeq
filter(const string &,const Ice::ObjectProxySeq & objects,const Ice::ConnectionPtr &,const Ice::Context & ctx)103 filter(const string& /*type*/, const Ice::ObjectProxySeq& objects, const Ice::ConnectionPtr&, const Ice::Context& ctx)
104 {
105 Ice::Context::const_iterator p = ctx.find("server");
106 if(p == ctx.end())
107 {
108 return objects;
109 }
110
111 string server = p->second;
112 Ice::ObjectProxySeq filteredObjects;
113 for(Ice::ObjectProxySeq::const_iterator q = objects.begin(); q != objects.end(); ++q)
114 {
115 if(_facade->getAdapterServer((*q)->ice_getAdapterId()) == server)
116 {
117 filteredObjects.push_back(*q);
118 }
119 }
120 return filteredObjects;
121 }
122
123 private:
124
125 RegistryPluginFacadePtr _facade;
126 };
127
128 class ExcludeReplicaGroupFilterI : public IceGrid::ReplicaGroupFilter
129 {
130 public:
131
ExcludeReplicaGroupFilterI(const RegistryPluginFacadePtr & facade,const string & exclude)132 ExcludeReplicaGroupFilterI(const RegistryPluginFacadePtr& facade, const string& exclude) :
133 _facade(facade), _exclude(exclude)
134 {
135 }
136
137 virtual Ice::StringSeq
filter(const string &,const Ice::StringSeq & adapters,const Ice::ConnectionPtr &,const Ice::Context & ctx)138 filter(const string& /*id*/, const Ice::StringSeq& adapters, const Ice::ConnectionPtr& /*con*/, const Ice::Context& ctx)
139 {
140 Ice::Context::const_iterator p = ctx.find("server");
141 if(p == ctx.end() || p->second == _exclude)
142 {
143 return Ice::StringSeq();
144 }
145 return adapters;
146 }
147
148 private:
149
150 const RegistryPluginFacadePtr _facade;
151 const string _exclude;
152 };
153
154 }
155
156 //
157 extern "C"
158 {
159
160 ICE_DECLSPEC_EXPORT Ice::Plugin*
createRegistryPlugin(const Ice::CommunicatorPtr & communicator,const string &,const Ice::StringSeq &)161 createRegistryPlugin(const Ice::CommunicatorPtr& communicator, const string&, const Ice::StringSeq&)
162 {
163 return new RegistryPluginI(communicator);
164 }
165
166 }
167
RegistryPluginI(const Ice::CommunicatorPtr & communicator)168 RegistryPluginI::RegistryPluginI(const Ice::CommunicatorPtr& communicator) : _communicator(communicator)
169 {
170 }
171
172 void
initialize()173 RegistryPluginI::initialize()
174 {
175 IceGrid::RegistryPluginFacadePtr facade = IceGrid::getRegistryPluginFacade();
176 assert(facade);
177
178 _filterByServer = new ReplicaGroupFilterI(facade);
179 _excludeServer2 = new ExcludeReplicaGroupFilterI(facade, "Server2");
180 _excludeServer3 = new ExcludeReplicaGroupFilterI(facade, "Server3");
181 _type = new TypeFilterI(facade);
182
183 facade->addReplicaGroupFilter("filterByServer", _filterByServer);
184 test(facade->removeReplicaGroupFilter("filterByServer", _filterByServer));
185 test(!facade->removeReplicaGroupFilter("filterByServer", _filterByServer));
186
187 facade->addReplicaGroupFilter("filterByServer", _filterByServer);
188 facade->addReplicaGroupFilter("excludeServer", _excludeServer2);
189 facade->addReplicaGroupFilter("excludeServer", _excludeServer3);
190 facade->addTypeFilter("::Test::TestIntf2", _type);
191 }
192
193 void
destroy()194 RegistryPluginI::destroy()
195 {
196 IceGrid::RegistryPluginFacadePtr facade = IceGrid::getRegistryPluginFacade();
197 assert(facade);
198
199 facade->removeReplicaGroupFilter("filterByServer", _filterByServer);
200 facade->removeReplicaGroupFilter("excludeServer", _excludeServer2);
201 facade->removeReplicaGroupFilter("excludeServer", _excludeServer3);
202 facade->removeTypeFilter("::Test::TestIntf2", _type);
203 }
204