github.com/Cloud-Foundations/Dominator@v0.3.4/imageserver/rpcd/api.go (about) 1 package rpcd 2 3 import ( 4 "errors" 5 "flag" 6 "io" 7 "sync" 8 9 "github.com/Cloud-Foundations/Dominator/imageserver/scanner" 10 "github.com/Cloud-Foundations/Dominator/lib/filter" 11 "github.com/Cloud-Foundations/Dominator/lib/log" 12 "github.com/Cloud-Foundations/Dominator/lib/objectserver" 13 "github.com/Cloud-Foundations/Dominator/lib/srpc" 14 ) 15 16 var ( 17 archiveExpiringImages = flag.Bool("archiveExpiringImages", false, 18 "If true, replicate expiring images when in archive mode") 19 archiveMode = flag.Bool("archiveMode", false, 20 "If true, disable delete operations and require update server") 21 replicationExcludeFilter = flag.String("replicationExcludeFilter", "", 22 "Filename containing filter to exclude images from replication (default do not exclude any)") 23 replicationIncludeFilter = flag.String("replicationIncludeFilter", "", 24 "Filename containing filter to include images for replication (default include all)") 25 ) 26 27 type srpcType struct { 28 imageDataBase *scanner.ImageDataBase 29 excludeFilter *filter.Filter 30 finishedReplication <-chan struct{} // Closed when finished. 31 includeFilter *filter.Filter 32 replicationMaster string 33 imageserverResource *srpc.ClientResource 34 objSrv objectserver.FullObjectServer 35 archiveMode bool 36 logger log.DebugLogger 37 numReplicationClientsLock sync.RWMutex // Protect numReplicationClients. 38 numReplicationClients uint 39 imagesBeingInjectedLock sync.Mutex // Protect imagesBeingInjected. 40 imagesBeingInjected map[string]struct{} 41 } 42 43 type htmlWriter srpcType 44 45 func (hw *htmlWriter) WriteHtml(writer io.Writer) { 46 hw.writeHtml(writer) 47 } 48 49 var replicationMessage = "cannot make changes while under replication control" + 50 ", go to master: " 51 52 func Setup(imdb *scanner.ImageDataBase, replicationMaster string, 53 objSrv objectserver.FullObjectServer, 54 logger log.DebugLogger) (*htmlWriter, error) { 55 if *archiveMode && replicationMaster == "" { 56 return nil, errors.New("replication master required in archive mode") 57 } 58 finishedReplication := make(chan struct{}) 59 srpcObj := &srpcType{ 60 imageDataBase: imdb, 61 finishedReplication: finishedReplication, 62 replicationMaster: replicationMaster, 63 imageserverResource: srpc.NewClientResource("tcp", replicationMaster), 64 objSrv: objSrv, 65 logger: logger, 66 archiveMode: *archiveMode, 67 imagesBeingInjected: make(map[string]struct{}), 68 } 69 var err error 70 if *replicationExcludeFilter != "" { 71 srpcObj.excludeFilter, err = filter.Load(*replicationExcludeFilter) 72 if err != nil { 73 return nil, err 74 } 75 } 76 if *replicationIncludeFilter != "" { 77 srpcObj.includeFilter, err = filter.Load(*replicationIncludeFilter) 78 if err != nil { 79 return nil, err 80 } 81 } 82 srpc.RegisterNameWithOptions("ImageServer", srpcObj, srpc.ReceiverOptions{ 83 PublicMethods: []string{ 84 "ChangeImageExpiration", 85 "CheckDirectory", 86 "CheckImage", 87 "ChownDirectory", 88 "DeleteImage", 89 "FindLatestImage", 90 "GetImage", 91 "GetImageExpiration", 92 "GetReplicationMaster", 93 "ListDirectories", 94 "ListImages", 95 "ListSelectedImages", 96 }}) 97 if replicationMaster != "" { 98 go srpcObj.replicator(finishedReplication) 99 } else { 100 close(finishedReplication) 101 } 102 return (*htmlWriter)(srpcObj), nil 103 }