package syncgroups import ( "fmt" "io" "github.com/golang/glog" "github.com/openshift/origin/pkg/client" "github.com/openshift/origin/pkg/cmd/admin/groups/sync/interfaces" ) // GroupPruner runs a prune job on Groups type GroupPruner interface { Prune() (errors []error) } // LDAPGroupPruner prunes Groups referencing records on an external LDAP server type LDAPGroupPruner struct { // Lists all groups to be synced GroupLister interfaces.LDAPGroupLister // Fetches a group and extracts object metainformation and membership list from a group GroupDetector interfaces.LDAPGroupDetector // Maps an LDAP group enrty to an OpenShift Group's Name GroupNameMapper interfaces.LDAPGroupNameMapper // Allows the Pruner to search for OpenShift Groups GroupClient client.GroupInterface // Host stores the address:port of the LDAP server Host string // DryRun indicates that no changes should be made. DryRun bool // Out is used to provide output while the sync job is happening Out io.Writer Err io.Writer } var _ GroupPruner = &LDAPGroupPruner{} // Prune allows the LDAPGroupPruner to be a GroupPruner func (s *LDAPGroupPruner) Prune() []error { var errors []error // determine what to sync glog.V(1).Infof("LDAPGroupPruner listing groups to prune with %v", s.GroupLister) ldapGroupUIDs, err := s.GroupLister.ListGroups() if err != nil { errors = append(errors, err) return errors } glog.V(1).Infof("LDAPGroupPruner will attempt to prune ldapGroupUIDs %v", ldapGroupUIDs) for _, ldapGroupUID := range ldapGroupUIDs { glog.V(1).Infof("Checking LDAP group %v", ldapGroupUID) exists, err := s.GroupDetector.Exists(ldapGroupUID) if err != nil { fmt.Fprintf(s.Err, "Error determining LDAP group existence for group %q: %v.\n", ldapGroupUID, err) errors = append(errors, err) continue } if exists { continue } // if the LDAP entry that was previously used to create the group doesn't exist, prune it groupName, err := s.GroupNameMapper.GroupNameFor(ldapGroupUID) if err != nil { fmt.Fprintf(s.Err, "Error determining OpenShift group name for LDAP group %q: %v.\n", ldapGroupUID, err) errors = append(errors, err) continue } if !s.DryRun { if err := s.GroupClient.Delete(groupName); err != nil { fmt.Fprintf(s.Err, "Error pruning OpenShift group %q: %v.\n", groupName, err) errors = append(errors, err) continue } } fmt.Fprintf(s.Out, "group/%s\n", groupName) } return errors }