github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/imageserver/rpcd/addImage.go (about) 1 package rpcd 2 3 import ( 4 "errors" 5 "time" 6 7 iclient "github.com/Cloud-Foundations/Dominator/imageserver/client" 8 "github.com/Cloud-Foundations/Dominator/lib/srpc" 9 "github.com/Cloud-Foundations/Dominator/proto/imageserver" 10 ) 11 12 func (t *srpcType) AddImage(conn *srpc.Conn, 13 request imageserver.AddImageRequest, 14 reply *imageserver.AddImageResponse) error { 15 request.Image.CreatedBy = conn.Username() // Must always set this field. 16 request.Image.CreatedOn = time.Now() // Must always set this field. 17 return t.AddImageTrusted(conn, request, reply) 18 } 19 20 func (t *srpcType) AddImageTrusted(conn *srpc.Conn, 21 request imageserver.AddImageRequest, 22 reply *imageserver.AddImageResponse) error { 23 if t.imageDataBase.CheckImage(request.ImageName) { 24 return errors.New("image already exists") 25 } 26 if request.Image == nil { 27 return errors.New("nil image") 28 } 29 if request.Image.FileSystem == nil { 30 return errors.New("nil file-system") 31 } 32 err := request.Image.VerifyObjects(t.imageDataBase.ObjectServer()) 33 if err != nil { 34 return err 35 } 36 t.setImageInjectionState(request.ImageName, true) 37 defer t.setImageInjectionState(request.ImageName, false) 38 if err := t.injectImage(conn, request); err != nil { 39 return err 40 } 41 request.Image.FileSystem.RebuildInodePointers() 42 username := request.Image.CreatedBy 43 if username == "" { 44 t.logger.Printf("AddImage(%s)\n", request.ImageName) 45 } else { 46 t.logger.Printf("AddImage(%s) by %s\n", request.ImageName, username) 47 } 48 return t.imageDataBase.AddImage(request.Image, request.ImageName, 49 conn.GetAuthInformation()) 50 } 51 52 func (t *srpcType) injectImage(conn *srpc.Conn, 53 request imageserver.AddImageRequest) error { 54 if t.replicationMaster == "" { 55 return nil 56 } 57 masterClient, err := srpc.DialHTTP("tcp", t.replicationMaster, 0) 58 if err != nil { 59 return err 60 } 61 return iclient.AddImageTrusted(masterClient, request.ImageName, 62 request.Image) 63 } 64 65 func (t *srpcType) setImageInjectionState(name string, injecting bool) { 66 t.imagesBeingInjectedLock.Lock() 67 defer t.imagesBeingInjectedLock.Unlock() 68 if injecting { 69 t.imagesBeingInjected[name] = struct{}{} 70 } else { 71 defer delete(t.imagesBeingInjected, name) 72 } 73 }