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  }