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  }