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