github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/imageserver/rpcd/getImage.go (about)

     1  package rpcd
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/Cloud-Foundations/Dominator/lib/image"
     7  	"github.com/Cloud-Foundations/Dominator/lib/srpc"
     8  	"github.com/Cloud-Foundations/Dominator/proto/imageserver"
     9  )
    10  
    11  func (t *srpcType) GetImage(conn *srpc.Conn,
    12  	request imageserver.GetImageRequest,
    13  	reply *imageserver.GetImageResponse) error {
    14  	var response imageserver.GetImageResponse
    15  	response.Image = t.getImageNow(request)
    16  	*reply = response
    17  	if response.Image != nil || request.Timeout == 0 {
    18  		return nil
    19  	}
    20  	// Image not found yet and willing to wait.
    21  	addCh := t.imageDataBase.RegisterAddNotifier()
    22  	defer func() {
    23  		t.imageDataBase.UnregisterAddNotifier(addCh)
    24  		select {
    25  		case <-addCh:
    26  		default:
    27  		}
    28  	}()
    29  	timer := time.NewTimer(request.Timeout)
    30  	for {
    31  		select {
    32  		case imageName := <-addCh:
    33  			if imageName == request.ImageName {
    34  				if !timer.Stop() {
    35  					<-timer.C
    36  				}
    37  				response.Image = t.getImageNow(request)
    38  				*reply = response
    39  				return nil
    40  			}
    41  		case <-timer.C:
    42  			return nil
    43  		}
    44  	}
    45  }
    46  
    47  func (t *srpcType) getImageNow(
    48  	request imageserver.GetImageRequest) *image.Image {
    49  	originalImage := t.imageDataBase.GetImage(request.ImageName)
    50  	if originalImage == nil {
    51  		return nil
    52  	}
    53  	img := *originalImage
    54  	if request.IgnoreFilesystem {
    55  		img.FileSystem = nil
    56  	} else if request.IgnoreFilesystemIfExpiring &&
    57  		!originalImage.ExpiresAt.IsZero() {
    58  		img.FileSystem = nil
    59  	}
    60  	return &img
    61  }