lxd/storage_pools.go
func storagePoolPut(d *Daemon, r *http.Request) Response {
	poolName := mux.Vars(r)["name"]

	// Get the existing storage pool.
	_, dbInfo, err := d.cluster.StoragePoolGet(poolName)
	if err != nil {
		return SmartError(err)
	}

	req := api.StoragePoolPut{}
	if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
		return BadRequest(err)
	}

	clustered, err := cluster.Enabled(d.db)
	if err != nil {
		return SmartError(err)
	}

	config := dbInfo.Config
	if clustered {
		err := storagePoolValidateClusterConfig(req.Config)
		if err != nil {
			return BadRequest(err)
		}
		config = storagePoolClusterConfigForEtag(config)
	}

	// Validate the ETag
	etag := []interface{}{dbInfo.Name, dbInfo.Driver, config}

	err = util.EtagCheck(r, etag)
	if err != nil {
		return PreconditionFailed(err)
	}

	// Validate the configuration
	err = storagePoolValidateConfig(poolName, dbInfo.Driver, req.Config, dbInfo.Config)
	if err != nil {
		return BadRequest(err)
	}

	config = req.Config
	if clustered {
		// For clustered requests, we need to complement the request's config
		// with our node-specific values.
		config = storagePoolClusterFillWithNodeConfig(dbInfo.Config, config)
	}

	// Notify the other nodes, unless this is itself a notification.
	if clustered && !isClusterNotification(r) {
		cert := d.endpoints.NetworkCert()
		notifier, err := cluster.NewNotifier(d.State(), cert, cluster.NotifyAll)
		if err != nil {
			return SmartError(err)
		}
		err = notifier(func(client lxd.ContainerServer) error {
			return client.UpdateStoragePool(poolName, req, r.Header.Get("If-Match"))
		})
		if err != nil {
			return SmartError(err)
		}
	}

	withDB := !isClusterNotification(r)
	err = storagePoolUpdate(d.State(), poolName, req.Description, config, withDB)
	if err != nil {
		return InternalError(err)
	}

	return EmptySyncResponse
}
func storagePoolPut(d *Daemon, r *http.Request) Response {
	poolName := mux.Vars(r)["name"]

	// Get the existing storage pool.
	_, dbInfo, err := d.cluster.StoragePoolGet(poolName)
	if err != nil {
		return SmartError(err)
	}

	req := api.StoragePoolPut{}
	if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
		return BadRequest(err)
	}

	clustered, err := cluster.Enabled(d.db)
	if err != nil {
		return SmartError(err)
	}

	config := dbInfo.Config
	if clustered {
		err := storagePoolValidateClusterConfig(req.Config)
		if err != nil {
			return BadRequest(err)
		}
		config = storagePoolClusterConfigForEtag(config)
	}

	// Validate the ETag
	etag := []interface{}{dbInfo.Name, dbInfo.Driver, config}

	err = util.EtagCheck(r, etag)
	if err != nil {
		return PreconditionFailed(err)
	}

	// Validate the configuration
	err = storagePoolValidateConfig(poolName, dbInfo.Driver, req.Config, dbInfo.Config)
	if err != nil {
		return BadRequest(err)
	}

	config = req.Config
	if clustered {
		// For clustered requests, we need to complement the request's config
		// with our node-specific values.
		config = storagePoolClusterFillWithNodeConfig(dbInfo.Config, config)
	}

	// Notify the other nodes, unless this is itself a notification.
	if clustered && !isClusterNotification(r) {
		cert := d.endpoints.NetworkCert()
		notifier, err := cluster.NewNotifier(d.State(), cert, cluster.NotifyAll)
		if err != nil {
			return SmartError(err)
		}
		err = notifier(func(client lxd.ContainerServer) error {
			return client.UpdateStoragePool(poolName, req, r.Header.Get("If-Match"))
		})
		if err != nil {
			return SmartError(err)
		}
	}

	withDB := !isClusterNotification(r)
	err = storagePoolUpdate(d.State(), poolName, req.Description, config, withDB)
	if err != nil {
		return InternalError(err)
	}

	return EmptySyncResponse
}
func storagePoolPut ( d * Daemon , r * http . Request ) Response { poolName := mux . Vars ( r ) [ " " ] // Get the existing storage pool. _ , dbInfo , err := d . cluster . StoragePoolGet ( poolName ) if err != nil { return SmartError ( err ) } req := api . StoragePoolPut { } if err := json . NewDecoder ( r . Body ) . Decode ( & req ) ; err != nil { return BadRequest ( err ) } clustered , err := cluster . Enabled ( d . db ) if err != nil { return SmartError ( err ) } config := dbInfo . Config if clustered { err := storagePoolValidateClusterConfig ( req . Config ) if err != nil { return BadRequest ( err ) } config = storagePoolClusterConfigForEtag ( config ) } // Validate the ETag etag := [ ] interface { } { dbInfo . Name , dbInfo . Driver , config } err = util . EtagCheck ( r , etag ) if err != nil { return PreconditionFailed ( err ) } // Validate the configuration err = storagePoolValidateConfig ( poolName , dbInfo . Driver , req . Config , dbInfo . Config ) if err != nil { return BadRequest ( err ) } config = req . Config if clustered { // For clustered requests, we need to complement the request's config // with our node-specific values. config = storagePoolClusterFillWithNodeConfig ( dbInfo . Config , config ) } // Notify the other nodes, unless this is itself a notification. if clustered && ! isClusterNotification ( r ) { cert := d . endpoints . NetworkCert ( ) notifier , err := cluster . NewNotifier ( d . State ( ) , cert , cluster . NotifyAll ) if err != nil { return SmartError ( err ) } err = notifier ( func ( client lxd . ContainerServer ) error { return client . UpdateStoragePool ( poolName , req , r . Header . Get ( " " ) ) } ) if err != nil { return SmartError ( err ) } } withDB := ! isClusterNotification ( r ) err = storagePoolUpdate ( d . State ( ) , poolName , req . Description , config , withDB ) if err != nil { return InternalError ( err ) } return EmptySyncResponse }
// /1.0/storage-pools/{name}
// Replace pool properties.
/ 1 . 0 / storage - pools / { name } Replace pool properties .