// Configure assigns functions to all the storage api handlers func (h *StorageHandlersImpl) Configure(api *operations.PortLayerAPI, handlerCtx *HandlerContext) { var err error ctx := context.Background() op := trace.NewOperation(ctx, "configure") if len(spl.Config.ImageStores) == 0 { log.Panicf("No image stores provided; unable to instantiate storage layer") } imageStoreURL := spl.Config.ImageStores[0] // TODO: support multiple image stores. Right now we only support the first one if len(spl.Config.ImageStores) > 1 { log.Warningf("Multiple image stores found. Multiple image stores are not yet supported. Using [%s] %s", imageStoreURL.Host, imageStoreURL.Path) } ds, err := vsphereSpl.NewImageStore(op, handlerCtx.Session, &imageStoreURL) if err != nil { log.Panicf("Cannot instantiate storage layer: %s", err) } // The imagestore is implemented via a cache which is backed via an // implementation that writes to disks. The cache is used to avoid // expensive metadata lookups. h.imageCache = spl.NewLookupCache(ds) // The same is done for volumes. It's implemented via a cache which writes // to an implementation that takes a datastore to write to. vsVolumeStore, err := vsphereSpl.NewVolumeStore(op, handlerCtx.Session) if err != nil { log.Panicf("Cannot instantiate the volume store: %s", err) } // Get the datastores for volumes. // Each volume store name maps to a datastore + path, which can be referred to by the name. dstores, err := datastore.GetDatastores(context.TODO(), handlerCtx.Session, spl.Config.VolumeLocations) if err != nil { log.Panicf("Cannot find datastores: %s", err) } // Add datastores to the vsphere volume store impl for volStoreName, volDatastore := range dstores { log.Infof("Adding volume store %s (%s)", volStoreName, volDatastore.RootURL) _, err := vsVolumeStore.AddStore(op, volDatastore, volStoreName) if err != nil { log.Errorf("volume addition error %s", err) } } h.volumeCache, err = spl.NewVolumeLookupCache(op, vsVolumeStore) if err != nil { log.Panicf("Cannot instantiate the Volume Lookup cache: %s", err) } api.StorageCreateImageStoreHandler = storage.CreateImageStoreHandlerFunc(h.CreateImageStore) api.StorageGetImageHandler = storage.GetImageHandlerFunc(h.GetImage) api.StorageGetImageTarHandler = storage.GetImageTarHandlerFunc(h.GetImageTar) api.StorageListImagesHandler = storage.ListImagesHandlerFunc(h.ListImages) api.StorageWriteImageHandler = storage.WriteImageHandlerFunc(h.WriteImage) api.StorageDeleteImageHandler = storage.DeleteImageHandlerFunc(h.DeleteImage) api.StorageVolumeStoresListHandler = storage.VolumeStoresListHandlerFunc(h.VolumeStoresList) api.StorageCreateVolumeHandler = storage.CreateVolumeHandlerFunc(h.CreateVolume) api.StorageRemoveVolumeHandler = storage.RemoveVolumeHandlerFunc(h.RemoveVolume) api.StorageVolumeJoinHandler = storage.VolumeJoinHandlerFunc(h.VolumeJoin) api.StorageListVolumesHandler = storage.ListVolumesHandlerFunc(h.VolumesList) api.StorageGetVolumeHandler = storage.GetVolumeHandlerFunc(h.GetVolume) }