Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  1. Make a view with the data you want to sync
  2. This can be based on some ad hoc groups, folders, or attributes on groups
  3. For instance this could be the view



  4. This view is defined (oracle) as:

    Code Block
    /* Formatted on 5/1/2019 11:27:03 AM (QP5 v5.252.13127.32847) */
    CREATE OR REPLACE FORCE VIEW PENN_MEMBERSHIPS_FEEDER_V
    (
       GROUP_ID, GROUP_NAME,LIST_NAME, LIST_TYPE, MEMBER_ID, SUBJECT_ID, SUBJECT_SOURCE
    )
       BEQUEATH DEFINER
    AS
       SELECT GROUP_ID,  group_name, list_name, GMLV.LIST_TYPE, GMLV.MEMBER_ID, GMLV.SUBJECT_ID, GMLV.SUBJECT_SOURCE
         FROM grouper_memberships_lw_v gmlv
        WHERE     (   GMLV.GROUP_NAME IN ('penn:community:student:studentThisTerm',
                                          'penn:community:student:degreePursual:degreePursual_LLM',
                                          ... )
                   OR gmlv.group_name LIKE 'penn:isc:ait:apps:atlassian:%')
              AND GMLV.SUBJECT_SOURCE = 'pennperson'
              AND list_type = 'list';
    
    



  5. Configure databases in grouper.client.properties.  Note, the "id" of the config group is the part of the config that ties them together, e.g. "pcom" or "awsDev"

    Code Block
    grouperClient.jdbc.pcom.driver = oracle.jdbc.driver.OracleDriver
    grouperClient.jdbc.pcom.url = jdbc:oracle:thin:@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = ...
    grouperClient.jdbc.pcom.user = myuser
    grouperClient.jdbc.pcom.pass = ******
    
    grouperClient.jdbc.awsDev.driver = org.postgresql.Driver
    grouperClient.jdbc.awsDev.url = jdbc:postgresql://penn ...
    grouperClient.jdbc.awsDev.user = anotheruser
    grouperClient.jdbc.awsDev.pass = ******
    
    

    Note, you can use the grouper database like this (in grouper.client.properties)

    Code Block
    grouperClient.jdbc.grouper.driver.elConfig = ${edu.internet2.middleware.grouper.cfg.GrouperHibernateConfig.retrieveConfig().propertyValueString("hibernate.connection.driver_class")}
    grouperClient.jdbc.grouper.url.elConfig = ${edu.internet2.middleware.grouper.cfg.GrouperHibernateConfig.retrieveConfig().propertyValueString("hibernate.connection.url")}
    grouperClient.jdbc.grouper.user.elConfig = ${edu.internet2.middleware.grouper.cfg.GrouperHibernateConfig.retrieveConfig().propertyValueString("hibernate.connection.username")}
    grouperClient.jdbc.grouper.pass.elConfig = ${edu.internet2.middleware.grouper.cfg.GrouperHibernateConfig.retrieveConfig().propertyValueString("hibernate.connection.password")}

    You can do a loader config database like this:

    Code Block
    grouperClient.jdbc.pcom2.driver.elConfig = ${edu.internet2.middleware.grouper.app.loader.GrouperLoaderConfig.retrieveConfig().propertyValueString("db.pcom2.driver")}
    grouperClient.jdbc.pcom2.url.elConfig = ${edu.internet2.middleware.grouper.app.loader.GrouperLoaderConfig.retrieveConfig().propertyValueString("db.pcom2.url")}
    grouperClient.jdbc.pcom2.user.elConfig = ${edu.internet2.middleware.grouper.app.loader.GrouperLoaderConfig.retrieveConfig().propertyValueString("db.pcom2.user")}
    grouperClient.jdbc.pcom2.pass.elConfig = ${edu.internet2.middleware.grouper.app.loader.GrouperLoaderConfig.retrieveConfig().propertyValueString("db.pcom2.pass")}



  6. Configure the table sync in grouper.client.properties

    Code Block
    
    # if this job should not run while another job is running, and share some configuration
    # {valueType: "string", multiple: true}
    grouperClient.syncTable.memberships.linkedConfigKeys = membershipsIncremental, membershipsGrouped
    
    # grouper client database key where copying data from
    # {valueType: "string"}
    grouperClient.syncTable.memberships.databaseFrom = pcom
    
    # table or view where copying data from
    # {valueType: "string"}
    grouperClient.syncTable.memberships.tableFrom = PENN_MEMBERSHIPS_FEEDER_V
    
    # grouper client database key where copying data to
    # {valueType: "string"}
    grouperClient.syncTable.memberships.databaseTo = awsDev
    
    # table or view where copying data to
    # {valueType: "string"}
    grouperClient.syncTable.memberships.tableTo = PENN_MEMBERSHIPS_TEMP
    
    # columns must match in from and to tables, you can specify columns or do all with an asterisk
    # {valueType: "string"}
    grouperClient.syncTable.memberships.columns = *
    
    # if there is a primary key, list it, else list the composite keys
    # {valueType: "string"}
    grouperClient.syncTable.memberships.primaryKeyColumns = group_id, list_name, member_id
    
    # the grouping column is what is uniquely selected, and then batched through to get data.
    # {valueType: "string"}
    grouperClient.syncTable.memberships.groupingColumn = group_id
    
    # the grouping column is what is uniquely selected, and then batched through to get data, defaults to 10000
    # {valueType: "integer"}
    grouperClient.syncTable.memberships.groupingSize = 5
    
    


  7. Setup an other job to run this in grouper-loader.properties

    Code Block
    # Object Type Job class
    # {valueType: "class", mustExtendClass: "edu.internet2.middleware.grouper.app.loader.OtherJobBase", mustImplementInterface: "org.quartz.Job"}
    otherJob.membershipSync.class = edu.internet2.middleware.grouper.app.tableSync.TableSyncOtherJob
    
    # Object Type Job cron
    # {valueType: "string"}
    otherJob.membershipSync.quartzCron = 0 0/30 * * * ?
    
    # this is the key in the grouper.client.properties that represents this job
    otherJob.membershipSync.grouperClientTableSyncConfigKey = memberships
    
    # full or incremental
    # {valueType: "string"}
    otherJob.membershipSync.syncType = full


...