RHN_ENTITLEMENTS
DDL scriptPackage source
Legend: string keyword reserved word operator
1: package rhn_entitlements
2: is
3: body_version varchar2(100) := '';
4:
5: type ents_array is varray(10) of rhnServerGroupType.label%TYPE;
6:
7: function entitlement_grants_service (
8: entitlement_in in varchar2,
9: service_level_in in varchar2
10: ) return number;
11:
12: function can_entitle_server (
13: server_id_in in number,
14: type_label_in in varchar2
15: )
16: return number;
17:
18: function can_switch_base (
19: server_id_in in integer,
20: type_label_in in varchar2
21: )
22: return number;
23:
24: procedure entitle_server (
25: server_id_in in number,
26: type_label_in in varchar2
27: );
28:
29: procedure remove_server_entitlement (
30: server_id_in in number,
31: type_label_in in varchar2
32: );
33:
34: procedure unentitle_server (
35: server_id_in in number
36: );
37:
38: function get_server_entitlement (
39: server_id_in in number
40: ) return ents_array;
41:
42: end rhn_entitlements;
Package body source
Legend: string keyword reserved word operator
1: package body rhn_entitlements
2: is
3: body_version varchar2(100) := '';
4:
5: function find_compatible_sg (
6: server_id_in in number,
7: type_label_in in varchar2
8: ) return number is
9:
10: cursor servergroups is
11: select sg.id id
12: from rhnServerGroupType sgt,
13: rhnServerGroup sg,
14: rhnServer s,
15: rhnServerServerGroupArchCompat ssgac
16: where s.id = server_id_in
17: and s.org_id = sg.org_id
18: and sgt.label = type_label_in
19: and sg.group_type = sgt.id
20: and ssgac.server_group_type = sgt.id
21: and ssgac.server_arch_id = s.server_arch_id
22: and not exists (
23: select 1
24: from rhnServerGroupMembers sgm
25: where sgm.server_group_id = sg.id
26: and sgm.server_id = s.id);
27:
28:
29: begin
30: for servergroup in servergroups loop
31: return servergroup.id;
32: end loop;
33:
34:
35: return null;
36: end find_compatible_sg;
37:
38: function entitlement_grants_service (
39: entitlement_in in varchar2,
40: service_level_in in varchar2
41: ) return number is
42: begin
43: if service_level_in = 'management' then
44: if entitlement_in = 'enterprise_entitled' then
45: return 1;
46: else
47: return 0;
48: end if;
49: elsif service_level_in = 'updates' then
50: return 1;
51: else
52: return 0;
53: end if;
54: end entitlement_grants_service;
55:
56: function can_entitle_server (
57: server_id_in in number,
58: type_label_in in varchar2 )
59: return number is
60: cursor addon_servergroups (base_label_in in varchar2,
61: addon_label_in in varchar2) is
62: select
63: addon_id
64: from
65: rhnSGTypeBaseAddonCompat
66: where base_id = lookup_sg_type (base_label_in)
67: and addon_id = lookup_sg_type (addon_label_in);
68:
69: previous_ent rhn_entitlements.ents_array;
70: is_base_in char := 'N';
71: is_base_current char := 'N';
72: i number := 0;
73: sgid number := 0;
74:
75: begin
76:
77: previous_ent := rhn_entitlements.ents_array();
78: previous_ent := rhn_entitlements.get_server_entitlement(server_id_in);
79:
80: select distinct is_base
81: into is_base_in
82: from rhnServerGroupType
83: where label = type_label_in;
84:
85: if previous_ent.count = 0 then
86: sgid := find_compatible_sg (server_id_in, type_label_in);
87: if (is_base_in = 'Y' and sgid is not null) then
88:
89: return 1;
90: else
91:
92: return 0;
93: end if;
94:
95:
96: elsif is_base_in = 'Y' then
97:
98: return 0;
99:
100:
101: else
102:
103:
104: is_base_current := 'N';
105: i := 0;
106: while is_base_current = 'N' and i <= previous_ent.count
107: loop
108: i := i + 1;
109: select is_base
110: into is_base_current
111: from rhnServerGroupType
112: where label = previous_ent(i);
113: end loop;
114:
115:
116: if is_base_current = 'N' then
117:
118: return 0;
119: end if;
120:
121:
122: for addon_servergroup in addon_servergroups (previous_ent(i), type_label_in) loop
123:
124: sgid := find_compatible_sg (server_id_in, type_label_in);
125: if sgid is not null then
126:
127: return 1;
128: else
129:
130: return 0;
131: end if;
132: end loop;
133:
134: end if;
135:
136: return 0;
137:
138: end can_entitle_server;
139:
140: function can_switch_base (
141: server_id_in in integer,
142: type_label_in in varchar2
143: ) return number is
144:
145: type_label_in_is_base char(1);
146: sgid number;
147:
148: begin
149:
150: begin
151: select is_base into type_label_in_is_base
152: from rhnServerGroupType
153: where label = type_label_in;
154: exception
155: when no_data_found then
156: rhn_exception.raise_exception ( 'invalid_entitlement' );
157: end;
158:
159: if type_label_in_is_base = 'N' then
160: rhn_exception.raise_exception ( 'invalid_entitlement' );
161: else
162: sgid := find_compatible_sg ( server_id_in, type_label_in );
163: if sgid is not null then
164: return 1;
165: else
166: return 0;
167: end if;
168: end if;
169:
170: end can_switch_base;
171:
172:
173: procedure entitle_server (
174: server_id_in in number,
175: type_label_in in varchar2
176: ) is
177: sgid number := 0;
178:
179: begin
180:
181: if rhn_entitlements.can_entitle_server(server_id_in,
182: type_label_in) = 1 then
183: sgid := find_compatible_sg (server_id_in, type_label_in);
184: if sgid is not null then
185: insert into rhnServerHistory ( id, server_id, summary, details )
186: values ( rhn_event_id_seq.nextval, server_id_in,
187: 'added system entitlement ',
188: case type_label_in
189: when 'enterprise_entitled' then 'Management'
190: when 'virtualization_host' then 'Virtualization'
191: end );
192:
193: rhn_server.insert_into_servergroup (server_id_in, sgid);
194:
195: else
196: rhn_exception.raise_exception ('no_available_server_group');
197: end if;
198: else
199: rhn_exception.raise_exception ('invalid_entitlement');
200: end if;
201: end entitle_server;
202:
203: procedure remove_server_entitlement (
204: server_id_in in number,
205: type_label_in in varchar2
206: ) is
207: group_id number;
208: type_is_base char;
209: begin
210: begin
211:
212: select sg.id, sgt.is_base
213: into group_id, type_is_base
214: from rhnServerGroupType sgt,
215: rhnServerGroup sg,
216: rhnServerGroupMembers sgm,
217: rhnServer s
218: where s.id = server_id_in
219: and s.id = sgm.server_id
220: and sgm.server_group_id = sg.id
221: and sg.org_id = s.org_id
222: and sgt.label = type_label_in
223: and sgt.id = sg.group_type;
224:
225: if ( type_is_base = 'Y' ) then
226:
227: unentitle_server ( server_id_in );
228: else
229:
230: insert into rhnServerHistory ( id, server_id, summary, details )
231: values ( rhn_event_id_seq.nextval, server_id_in,
232: 'removed system entitlement ',
233: case type_label_in
234: when 'enterprise_entitled' then 'Management'
235: when 'virtualization_host' then 'Virtualization'
236: end );
237:
238: rhn_server.delete_from_servergroup(server_id_in, group_id);
239:
240: end if;
241:
242: exception
243: when no_data_found then
244: rhn_exception.raise_exception('invalid_server_group_member');
245: end;
246:
247: end remove_server_entitlement;
248:
249:
250: procedure unentitle_server (server_id_in in number) is
251:
252: cursor servergroups is
253: select distinct sgt.label, sg.id server_group_id
254: from rhnServerGroupType sgt,
255: rhnServerGroup sg,
256: rhnServer s,
257: rhnServerGroupMembers sgm
258: where s.id = server_id_in
259: and s.org_id = sg.org_id
260: and sg.group_type = sgt.id
261: and sgm.server_group_id = sg.id
262: and sgm.server_id = s.id;
263: begin
264:
265: for servergroup in servergroups loop
266:
267: insert into rhnServerHistory ( id, server_id, summary, details )
268: values ( rhn_event_id_seq.nextval, server_id_in,
269: 'removed system entitlement ',
270: case servergroup.label
271: when 'enterprise_entitled' then 'Management'
272: when 'virtualization_host' then 'Virtualization'
273: end );
274:
275: rhn_server.delete_from_servergroup(server_id_in,
276: servergroup.server_group_id );
277: end loop;
278:
279: end unentitle_server;
280:
281:
282: function get_server_entitlement (
283: server_id_in in number
284: ) return ents_array is
285:
286: cursor server_groups is
287: select sgt.label
288: from rhnServerGroupType sgt,
289: rhnServerGroup sg,
290: rhnServerGroupMembers sgm
291: where 1=1
292: and sgm.server_id = server_id_in
293: and sg.id = sgm.server_group_id
294: and sgt.id = sg.group_type
295: and sgt.label in (
296: 'enterprise_entitled',
297: 'virtualization_host'
298: );
299:
300: ent_array ents_array;
301:
302: begin
303:
304: ent_array := ents_array();
305:
306: for sg in server_groups loop
307: ent_array.extend;
308: ent_array(ent_array.count) := sg.label;
309: end loop;
310:
311: return ent_array;
312:
313: end get_server_entitlement;
314:
315: end rhn_entitlements;