Main Tables Views Materialized Views Indexes Constraints Triggers Procedures Functions Packages Sequences Java Sources Jobs Sanity Check Index DDL scrips
Package source Package body source

RHN_ENTITLEMENTS

DDL script

Package source

Legend: comment 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: comment 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:       --no servergroup found
    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:             -- rhn_server.insert_into_servergroup (server_id_in, sgid);
    89:             return 1;
    90:          else
    91:             -- rhn_exception.raise_exception ('invalid_base_entitlement');
    92:             return 0;
    93:          end if;
    94: 
    95:       -- there are previous ents, first make sure we're not trying to entitle a base ent
    96:       elsif is_base_in = 'Y' then
    97:          -- rhn_exception.raise_exception ('invalid_addon_entitlement');
    98:          return 0;
    99: 
   100:       -- it must be an addon, so proceed with the entitlement
   101:       else
   102: 
   103:          -- find the servers base ent
   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:          -- never found a base ent, that would be strange
   116:          if is_base_current  = 'N' then
   117:             -- rhn_exception.raise_exception ('invalid_base_entitlement');
   118:             return 0;
   119:          end if;
   120: 
   121:          -- this for loop verifies the validity of the addon path
   122:          for addon_servergroup in addon_servergroups  (previous_ent(i), type_label_in) loop
   123:             -- find an appropriate sgid for the addon and entitle the server
   124:             sgid := find_compatible_sg (server_id_in, type_label_in);
   125:             if sgid is not null then
   126:                -- rhn_server.insert_into_servergroup (server_id_in, sgid);
   127:                return 1;
   128:             else
   129:                -- rhn_exception.raise_exception ('invalid_addon_entitlement');
   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:          -- unentitle_server should handle everything, don't really need to do anything else special here
   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;