mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-09-21 18:11:22 +00:00
Propagate error from NewREST
This commit is contained in:
@@ -33,7 +33,7 @@ type REST struct {
|
||||
}
|
||||
|
||||
// NewREST returns a RESTStorage object that will work with ControllerRevision objects.
|
||||
func NewREST(optsGetter generic.RESTOptionsGetter) *REST {
|
||||
func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, error) {
|
||||
store := &genericregistry.Store{
|
||||
NewFunc: func() runtime.Object { return &apps.ControllerRevision{} },
|
||||
NewListFunc: func() runtime.Object { return &apps.ControllerRevisionList{} },
|
||||
@@ -47,7 +47,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST {
|
||||
}
|
||||
options := &generic.StoreOptions{RESTOptions: optsGetter}
|
||||
if err := store.CompleteWithOptions(options); err != nil {
|
||||
panic(err)
|
||||
return nil, err
|
||||
}
|
||||
return &REST{store}
|
||||
return &REST{store}, nil
|
||||
}
|
||||
|
@@ -160,7 +160,10 @@ func newStorage(t *testing.T) (*REST, *etcd3testing.EtcdTestServer) {
|
||||
Decorator: generic.UndecoratedStorage,
|
||||
DeleteCollectionWorkers: 1,
|
||||
ResourcePrefix: "controllerrevisions"}
|
||||
storage := NewREST(restOptions)
|
||||
storage, err := NewREST(restOptions)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error from REST storage: %v", err)
|
||||
}
|
||||
return storage, server
|
||||
}
|
||||
|
||||
|
@@ -38,7 +38,7 @@ type REST struct {
|
||||
}
|
||||
|
||||
// NewREST returns a RESTStorage object that will work against DaemonSets.
|
||||
func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) {
|
||||
func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) {
|
||||
store := &genericregistry.Store{
|
||||
NewFunc: func() runtime.Object { return &apps.DaemonSet{} },
|
||||
NewListFunc: func() runtime.Object { return &apps.DaemonSetList{} },
|
||||
@@ -52,13 +52,13 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) {
|
||||
}
|
||||
options := &generic.StoreOptions{RESTOptions: optsGetter}
|
||||
if err := store.CompleteWithOptions(options); err != nil {
|
||||
panic(err) // TODO: Propagate error up
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
statusStore := *store
|
||||
statusStore.UpdateStrategy = daemonset.StatusStrategy
|
||||
|
||||
return &REST{store, []string{"all"}}, &StatusREST{store: &statusStore}
|
||||
return &REST{store, []string{"all"}}, &StatusREST{store: &statusStore}, nil
|
||||
}
|
||||
|
||||
// Implement ShortNamesProvider
|
||||
|
@@ -39,7 +39,10 @@ func newStorage(t *testing.T) (*REST, *StatusREST, *etcd3testing.EtcdTestServer)
|
||||
DeleteCollectionWorkers: 1,
|
||||
ResourcePrefix: "daemonsets",
|
||||
}
|
||||
daemonSetStorage, statusStorage := NewREST(restOptions)
|
||||
daemonSetStorage, statusStorage, err := NewREST(restOptions)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error from REST storage: %v", err)
|
||||
}
|
||||
return daemonSetStorage, statusStorage, server
|
||||
}
|
||||
|
||||
|
@@ -53,15 +53,18 @@ type DeploymentStorage struct {
|
||||
Rollback *RollbackREST
|
||||
}
|
||||
|
||||
func NewStorage(optsGetter generic.RESTOptionsGetter) DeploymentStorage {
|
||||
deploymentRest, deploymentStatusRest, deploymentRollbackRest := NewREST(optsGetter)
|
||||
func NewStorage(optsGetter generic.RESTOptionsGetter) (DeploymentStorage, error) {
|
||||
deploymentRest, deploymentStatusRest, deploymentRollbackRest, err := NewREST(optsGetter)
|
||||
if err != nil {
|
||||
return DeploymentStorage{}, err
|
||||
}
|
||||
|
||||
return DeploymentStorage{
|
||||
Deployment: deploymentRest,
|
||||
Status: deploymentStatusRest,
|
||||
Scale: &ScaleREST{store: deploymentRest.Store},
|
||||
Rollback: deploymentRollbackRest,
|
||||
}
|
||||
}, nil
|
||||
}
|
||||
|
||||
type REST struct {
|
||||
@@ -70,7 +73,7 @@ type REST struct {
|
||||
}
|
||||
|
||||
// NewREST returns a RESTStorage object that will work against deployments.
|
||||
func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *RollbackREST) {
|
||||
func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *RollbackREST, error) {
|
||||
store := &genericregistry.Store{
|
||||
NewFunc: func() runtime.Object { return &apps.Deployment{} },
|
||||
NewListFunc: func() runtime.Object { return &apps.DeploymentList{} },
|
||||
@@ -84,12 +87,12 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *Rollbac
|
||||
}
|
||||
options := &generic.StoreOptions{RESTOptions: optsGetter}
|
||||
if err := store.CompleteWithOptions(options); err != nil {
|
||||
panic(err) // TODO: Propagate error up
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
|
||||
statusStore := *store
|
||||
statusStore.UpdateStrategy = deployment.StatusStrategy
|
||||
return &REST{store, []string{"all"}}, &StatusREST{store: &statusStore}, &RollbackREST{store: store}
|
||||
return &REST{store, []string{"all"}}, &StatusREST{store: &statusStore}, &RollbackREST{store: store}, nil
|
||||
}
|
||||
|
||||
// Implement ShortNamesProvider
|
||||
|
@@ -47,7 +47,10 @@ const defaultReplicas = 100
|
||||
func newStorage(t *testing.T) (*DeploymentStorage, *etcd3testing.EtcdTestServer) {
|
||||
etcdStorage, server := registrytest.NewEtcdStorage(t, apps.GroupName)
|
||||
restOptions := generic.RESTOptions{StorageConfig: etcdStorage, Decorator: generic.UndecoratedStorage, DeleteCollectionWorkers: 1, ResourcePrefix: "deployments"}
|
||||
deploymentStorage := NewStorage(restOptions)
|
||||
deploymentStorage, err := NewStorage(restOptions)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error from REST storage: %v", err)
|
||||
}
|
||||
return &deploymentStorage, server
|
||||
}
|
||||
|
||||
|
@@ -49,14 +49,17 @@ type ReplicaSetStorage struct {
|
||||
Scale *ScaleREST
|
||||
}
|
||||
|
||||
func NewStorage(optsGetter generic.RESTOptionsGetter) ReplicaSetStorage {
|
||||
replicaSetRest, replicaSetStatusRest := NewREST(optsGetter)
|
||||
func NewStorage(optsGetter generic.RESTOptionsGetter) (ReplicaSetStorage, error) {
|
||||
replicaSetRest, replicaSetStatusRest, err := NewREST(optsGetter)
|
||||
if err != nil {
|
||||
return ReplicaSetStorage{}, err
|
||||
}
|
||||
|
||||
return ReplicaSetStorage{
|
||||
ReplicaSet: replicaSetRest,
|
||||
Status: replicaSetStatusRest,
|
||||
Scale: &ScaleREST{store: replicaSetRest.Store},
|
||||
}
|
||||
}, nil
|
||||
}
|
||||
|
||||
type REST struct {
|
||||
@@ -65,7 +68,7 @@ type REST struct {
|
||||
}
|
||||
|
||||
// NewREST returns a RESTStorage object that will work against ReplicaSet.
|
||||
func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) {
|
||||
func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) {
|
||||
store := &genericregistry.Store{
|
||||
NewFunc: func() runtime.Object { return &apps.ReplicaSet{} },
|
||||
NewListFunc: func() runtime.Object { return &apps.ReplicaSetList{} },
|
||||
@@ -80,13 +83,13 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) {
|
||||
}
|
||||
options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: replicaset.GetAttrs}
|
||||
if err := store.CompleteWithOptions(options); err != nil {
|
||||
panic(err) // TODO: Propagate error up
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
statusStore := *store
|
||||
statusStore.UpdateStrategy = replicaset.StatusStrategy
|
||||
|
||||
return &REST{store, []string{"all"}}, &StatusREST{store: &statusStore}
|
||||
return &REST{store, []string{"all"}}, &StatusREST{store: &statusStore}, nil
|
||||
}
|
||||
|
||||
// Implement ShortNamesProvider
|
||||
|
@@ -42,7 +42,10 @@ const defaultReplicas = 100
|
||||
func newStorage(t *testing.T) (*ReplicaSetStorage, *etcd3testing.EtcdTestServer) {
|
||||
etcdStorage, server := registrytest.NewEtcdStorage(t, "extensions")
|
||||
restOptions := generic.RESTOptions{StorageConfig: etcdStorage, Decorator: generic.UndecoratedStorage, DeleteCollectionWorkers: 1, ResourcePrefix: "replicasets"}
|
||||
replicaSetStorage := NewStorage(restOptions)
|
||||
replicaSetStorage, err := NewStorage(restOptions)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error from REST storage: %v", err)
|
||||
}
|
||||
return &replicaSetStorage, server
|
||||
}
|
||||
|
||||
|
@@ -35,111 +35,162 @@ import (
|
||||
|
||||
type RESTStorageProvider struct{}
|
||||
|
||||
func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) {
|
||||
func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool, error) {
|
||||
apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(apps.GroupName, legacyscheme.Scheme, legacyscheme.ParameterCodec, legacyscheme.Codecs)
|
||||
// If you add a version here, be sure to add an entry in `k8s.io/kubernetes/cmd/kube-apiserver/app/aggregator.go with specific priorities.
|
||||
// TODO refactor the plumbing to provide the information in the APIGroupInfo
|
||||
|
||||
if apiResourceConfigSource.VersionEnabled(appsapiv1beta1.SchemeGroupVersion) {
|
||||
apiGroupInfo.VersionedResourcesStorageMap[appsapiv1beta1.SchemeGroupVersion.Version] = p.v1beta1Storage(apiResourceConfigSource, restOptionsGetter)
|
||||
if storageMap, err := p.v1beta1Storage(apiResourceConfigSource, restOptionsGetter); err != nil {
|
||||
return genericapiserver.APIGroupInfo{}, false, err
|
||||
} else {
|
||||
apiGroupInfo.VersionedResourcesStorageMap[appsapiv1beta1.SchemeGroupVersion.Version] = storageMap
|
||||
}
|
||||
}
|
||||
if apiResourceConfigSource.VersionEnabled(appsapiv1beta2.SchemeGroupVersion) {
|
||||
apiGroupInfo.VersionedResourcesStorageMap[appsapiv1beta2.SchemeGroupVersion.Version] = p.v1beta2Storage(apiResourceConfigSource, restOptionsGetter)
|
||||
if storageMap, err := p.v1beta2Storage(apiResourceConfigSource, restOptionsGetter); err != nil {
|
||||
return genericapiserver.APIGroupInfo{}, false, err
|
||||
} else {
|
||||
apiGroupInfo.VersionedResourcesStorageMap[appsapiv1beta2.SchemeGroupVersion.Version] = storageMap
|
||||
}
|
||||
}
|
||||
if apiResourceConfigSource.VersionEnabled(appsapiv1.SchemeGroupVersion) {
|
||||
apiGroupInfo.VersionedResourcesStorageMap[appsapiv1.SchemeGroupVersion.Version] = p.v1Storage(apiResourceConfigSource, restOptionsGetter)
|
||||
if storageMap, err := p.v1Storage(apiResourceConfigSource, restOptionsGetter); err != nil {
|
||||
return genericapiserver.APIGroupInfo{}, false, err
|
||||
} else {
|
||||
apiGroupInfo.VersionedResourcesStorageMap[appsapiv1.SchemeGroupVersion.Version] = storageMap
|
||||
}
|
||||
}
|
||||
|
||||
return apiGroupInfo, true
|
||||
return apiGroupInfo, true, nil
|
||||
}
|
||||
|
||||
func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage {
|
||||
func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (map[string]rest.Storage, error) {
|
||||
storage := map[string]rest.Storage{}
|
||||
|
||||
// deployments
|
||||
deploymentStorage := deploymentstore.NewStorage(restOptionsGetter)
|
||||
deploymentStorage, err := deploymentstore.NewStorage(restOptionsGetter)
|
||||
if err != nil {
|
||||
return storage, err
|
||||
}
|
||||
storage["deployments"] = deploymentStorage.Deployment
|
||||
storage["deployments/status"] = deploymentStorage.Status
|
||||
storage["deployments/rollback"] = deploymentStorage.Rollback
|
||||
storage["deployments/scale"] = deploymentStorage.Scale
|
||||
|
||||
// statefulsets
|
||||
statefulSetStorage := statefulsetstore.NewStorage(restOptionsGetter)
|
||||
statefulSetStorage, err := statefulsetstore.NewStorage(restOptionsGetter)
|
||||
if err != nil {
|
||||
return storage, err
|
||||
}
|
||||
storage["statefulsets"] = statefulSetStorage.StatefulSet
|
||||
storage["statefulsets/status"] = statefulSetStorage.Status
|
||||
storage["statefulsets/scale"] = statefulSetStorage.Scale
|
||||
|
||||
// controllerrevisions
|
||||
historyStorage := controllerrevisionsstore.NewREST(restOptionsGetter)
|
||||
historyStorage, err := controllerrevisionsstore.NewREST(restOptionsGetter)
|
||||
if err != nil {
|
||||
return storage, err
|
||||
}
|
||||
storage["controllerrevisions"] = historyStorage
|
||||
|
||||
return storage
|
||||
return storage, nil
|
||||
}
|
||||
|
||||
func (p RESTStorageProvider) v1beta2Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage {
|
||||
func (p RESTStorageProvider) v1beta2Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (map[string]rest.Storage, error) {
|
||||
storage := map[string]rest.Storage{}
|
||||
|
||||
// deployments
|
||||
deploymentStorage := deploymentstore.NewStorage(restOptionsGetter)
|
||||
deploymentStorage, err := deploymentstore.NewStorage(restOptionsGetter)
|
||||
if err != nil {
|
||||
return storage, err
|
||||
}
|
||||
storage["deployments"] = deploymentStorage.Deployment
|
||||
storage["deployments/status"] = deploymentStorage.Status
|
||||
storage["deployments/scale"] = deploymentStorage.Scale
|
||||
|
||||
// statefulsets
|
||||
statefulSetStorage := statefulsetstore.NewStorage(restOptionsGetter)
|
||||
statefulSetStorage, err := statefulsetstore.NewStorage(restOptionsGetter)
|
||||
if err != nil {
|
||||
return storage, err
|
||||
}
|
||||
storage["statefulsets"] = statefulSetStorage.StatefulSet
|
||||
storage["statefulsets/status"] = statefulSetStorage.Status
|
||||
storage["statefulsets/scale"] = statefulSetStorage.Scale
|
||||
|
||||
// daemonsets
|
||||
daemonSetStorage, daemonSetStatusStorage := daemonsetstore.NewREST(restOptionsGetter)
|
||||
daemonSetStorage, daemonSetStatusStorage, err := daemonsetstore.NewREST(restOptionsGetter)
|
||||
if err != nil {
|
||||
return storage, err
|
||||
}
|
||||
storage["daemonsets"] = daemonSetStorage
|
||||
storage["daemonsets/status"] = daemonSetStatusStorage
|
||||
|
||||
// replicasets
|
||||
replicaSetStorage := replicasetstore.NewStorage(restOptionsGetter)
|
||||
replicaSetStorage, err := replicasetstore.NewStorage(restOptionsGetter)
|
||||
if err != nil {
|
||||
return storage, err
|
||||
}
|
||||
storage["replicasets"] = replicaSetStorage.ReplicaSet
|
||||
storage["replicasets/status"] = replicaSetStorage.Status
|
||||
storage["replicasets/scale"] = replicaSetStorage.Scale
|
||||
|
||||
// controllerrevisions
|
||||
historyStorage := controllerrevisionsstore.NewREST(restOptionsGetter)
|
||||
historyStorage, err := controllerrevisionsstore.NewREST(restOptionsGetter)
|
||||
if err != nil {
|
||||
return storage, err
|
||||
}
|
||||
storage["controllerrevisions"] = historyStorage
|
||||
|
||||
return storage
|
||||
return storage, nil
|
||||
}
|
||||
|
||||
func (p RESTStorageProvider) v1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage {
|
||||
func (p RESTStorageProvider) v1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (map[string]rest.Storage, error) {
|
||||
storage := map[string]rest.Storage{}
|
||||
|
||||
// deployments
|
||||
deploymentStorage := deploymentstore.NewStorage(restOptionsGetter)
|
||||
deploymentStorage, err := deploymentstore.NewStorage(restOptionsGetter)
|
||||
if err != nil {
|
||||
return storage, err
|
||||
}
|
||||
storage["deployments"] = deploymentStorage.Deployment
|
||||
storage["deployments/status"] = deploymentStorage.Status
|
||||
storage["deployments/scale"] = deploymentStorage.Scale
|
||||
|
||||
// statefulsets
|
||||
statefulSetStorage := statefulsetstore.NewStorage(restOptionsGetter)
|
||||
statefulSetStorage, err := statefulsetstore.NewStorage(restOptionsGetter)
|
||||
if err != nil {
|
||||
return storage, err
|
||||
}
|
||||
storage["statefulsets"] = statefulSetStorage.StatefulSet
|
||||
storage["statefulsets/status"] = statefulSetStorage.Status
|
||||
storage["statefulsets/scale"] = statefulSetStorage.Scale
|
||||
|
||||
// daemonsets
|
||||
daemonSetStorage, daemonSetStatusStorage := daemonsetstore.NewREST(restOptionsGetter)
|
||||
daemonSetStorage, daemonSetStatusStorage, err := daemonsetstore.NewREST(restOptionsGetter)
|
||||
if err != nil {
|
||||
return storage, err
|
||||
}
|
||||
storage["daemonsets"] = daemonSetStorage
|
||||
storage["daemonsets/status"] = daemonSetStatusStorage
|
||||
|
||||
// replicasets
|
||||
replicaSetStorage := replicasetstore.NewStorage(restOptionsGetter)
|
||||
replicaSetStorage, err := replicasetstore.NewStorage(restOptionsGetter)
|
||||
if err != nil {
|
||||
return storage, err
|
||||
}
|
||||
storage["replicasets"] = replicaSetStorage.ReplicaSet
|
||||
storage["replicasets/status"] = replicaSetStorage.Status
|
||||
storage["replicasets/scale"] = replicaSetStorage.Scale
|
||||
|
||||
// controllerrevisions
|
||||
historyStorage := controllerrevisionsstore.NewREST(restOptionsGetter)
|
||||
historyStorage, err := controllerrevisionsstore.NewREST(restOptionsGetter)
|
||||
if err != nil {
|
||||
return storage, err
|
||||
}
|
||||
storage["controllerrevisions"] = historyStorage
|
||||
|
||||
return storage
|
||||
return storage, nil
|
||||
}
|
||||
|
||||
func (p RESTStorageProvider) GroupName() string {
|
||||
|
@@ -46,14 +46,17 @@ type StatefulSetStorage struct {
|
||||
Scale *ScaleREST
|
||||
}
|
||||
|
||||
func NewStorage(optsGetter generic.RESTOptionsGetter) StatefulSetStorage {
|
||||
statefulSetRest, statefulSetStatusRest := NewREST(optsGetter)
|
||||
func NewStorage(optsGetter generic.RESTOptionsGetter) (StatefulSetStorage, error) {
|
||||
statefulSetRest, statefulSetStatusRest, err := NewREST(optsGetter)
|
||||
if err != nil {
|
||||
return StatefulSetStorage{}, err
|
||||
}
|
||||
|
||||
return StatefulSetStorage{
|
||||
StatefulSet: statefulSetRest,
|
||||
Status: statefulSetStatusRest,
|
||||
Scale: &ScaleREST{store: statefulSetRest.Store},
|
||||
}
|
||||
}, nil
|
||||
}
|
||||
|
||||
// rest implements a RESTStorage for statefulsets against etcd
|
||||
@@ -62,7 +65,7 @@ type REST struct {
|
||||
}
|
||||
|
||||
// NewREST returns a RESTStorage object that will work against statefulsets.
|
||||
func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) {
|
||||
func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) {
|
||||
store := &genericregistry.Store{
|
||||
NewFunc: func() runtime.Object { return &apps.StatefulSet{} },
|
||||
NewListFunc: func() runtime.Object { return &apps.StatefulSetList{} },
|
||||
@@ -76,12 +79,12 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) {
|
||||
}
|
||||
options := &generic.StoreOptions{RESTOptions: optsGetter}
|
||||
if err := store.CompleteWithOptions(options); err != nil {
|
||||
panic(err) // TODO: Propagate error up
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
statusStore := *store
|
||||
statusStore.UpdateStrategy = statefulset.StatusStrategy
|
||||
return &REST{store}, &StatusREST{store: &statusStore}
|
||||
return &REST{store}, &StatusREST{store: &statusStore}, nil
|
||||
}
|
||||
|
||||
// Implement CategoriesProvider
|
||||
|
@@ -40,7 +40,10 @@ import (
|
||||
func newStorage(t *testing.T) (StatefulSetStorage, *etcd3testing.EtcdTestServer) {
|
||||
etcdStorage, server := registrytest.NewEtcdStorage(t, apps.GroupName)
|
||||
restOptions := generic.RESTOptions{StorageConfig: etcdStorage, Decorator: generic.UndecoratedStorage, DeleteCollectionWorkers: 1, ResourcePrefix: "statefulsets"}
|
||||
storage := NewStorage(restOptions)
|
||||
storage, err := NewStorage(restOptions)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error from REST storage: %v", err)
|
||||
}
|
||||
return storage, server
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user