github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/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/log" 11 "github.com/Cloud-Foundations/Dominator/lib/objectserver" 12 "github.com/Cloud-Foundations/Dominator/lib/srpc" 13 ) 14 15 var ( 16 archiveExpiringImages = flag.Bool("archiveExpiringImages", false, 17 "If true, replicate expiring images when in archive mode") 18 archiveMode = flag.Bool("archiveMode", false, 19 "If true, disable delete operations and require update server") 20 ) 21 22 type srpcType struct { 23 imageDataBase *scanner.ImageDataBase 24 finishedReplication <-chan struct{} // Closed when finished. 25 replicationMaster string 26 imageserverResource *srpc.ClientResource 27 objSrv objectserver.FullObjectServer 28 archiveMode bool 29 logger log.Logger 30 numReplicationClientsLock sync.RWMutex // Protect numReplicationClients. 31 numReplicationClients uint 32 imagesBeingInjectedLock sync.Mutex // Protect imagesBeingInjected. 33 imagesBeingInjected map[string]struct{} 34 } 35 36 type htmlWriter srpcType 37 38 func (hw *htmlWriter) WriteHtml(writer io.Writer) { 39 hw.writeHtml(writer) 40 } 41 42 var replicationMessage = "cannot make changes while under replication control" + 43 ", go to master: " 44 45 func Setup(imdb *scanner.ImageDataBase, replicationMaster string, 46 objSrv objectserver.FullObjectServer, 47 logger log.Logger) (*htmlWriter, error) { 48 if *archiveMode && replicationMaster == "" { 49 return nil, errors.New("replication master required in archive mode") 50 } 51 finishedReplication := make(chan struct{}) 52 srpcObj := &srpcType{ 53 imageDataBase: imdb, 54 finishedReplication: finishedReplication, 55 replicationMaster: replicationMaster, 56 imageserverResource: srpc.NewClientResource("tcp", replicationMaster), 57 objSrv: objSrv, 58 logger: logger, 59 archiveMode: *archiveMode, 60 imagesBeingInjected: make(map[string]struct{}), 61 } 62 srpc.RegisterNameWithOptions("ImageServer", srpcObj, srpc.ReceiverOptions{ 63 PublicMethods: []string{ 64 "ChangeImageExpiration", 65 "CheckDirectory", 66 "CheckImage", 67 "ChownDirectory", 68 "DeleteImage", 69 "FindLatestImage", 70 "GetImage", 71 "GetImageExpiration", 72 "ListDirectories", 73 "ListImages", 74 }}) 75 if replicationMaster != "" { 76 go srpcObj.replicator(finishedReplication) 77 } else { 78 close(finishedReplication) 79 } 80 return (*htmlWriter)(srpcObj), nil 81 }