diff --git a/public/app/features/apiserver/server.ts b/public/app/features/apiserver/client.ts similarity index 89% rename from public/app/features/apiserver/server.ts rename to public/app/features/apiserver/client.ts index c7aca0a4fd5..d033a093df7 100644 --- a/public/app/features/apiserver/server.ts +++ b/public/app/features/apiserver/client.ts @@ -8,7 +8,7 @@ import { Resource, ResourceForCreate, ResourceList, - ResourceServer, + ResourceClient, } from './types'; export interface GroupVersionResource { @@ -17,7 +17,7 @@ export interface GroupVersionResource { resource: string; } -export class ScopedResourceServer implements ResourceServer { +export class ScopedResourceClient implements ResourceClient { readonly url: string; constructor(gvr: GroupVersionResource, namespaced = true) { @@ -27,6 +27,9 @@ export class ScopedResourceServer implements ResourceSer } public async create(obj: ResourceForCreate): Promise { + if (!obj.metadata.name && !obj.metadata.generateName) { + obj.metadata.generateName = 'g'; // Triggers the server to create a unique value + } return getBackendSrv().post(this.url, obj); } diff --git a/public/app/features/apiserver/types.ts b/public/app/features/apiserver/types.ts index 56fbbf5ac7b..102e9a79ee6 100644 --- a/public/app/features/apiserver/types.ts +++ b/public/app/features/apiserver/types.ts @@ -63,7 +63,10 @@ export interface Resource extends TypeMeta { } export interface ResourceForCreate extends Partial> { - metadata: Partial; + metadata: Partial & { + // When creating a resource, it must set a name or generateName to create a unique one on the server + generateName?: string; + }; spec: T; } @@ -138,7 +141,7 @@ export interface MetaStatus { details?: object; } -export interface ResourceServer { +export interface ResourceClient { create(obj: ResourceForCreate): Promise; get(name: string): Promise>; list(opts?: ListOptions): Promise>; diff --git a/public/app/features/dashboard-scene/scene/ScopesDashboardsScene.tsx b/public/app/features/dashboard-scene/scene/ScopesDashboardsScene.tsx index 651085d943b..5322c1e5e6f 100644 --- a/public/app/features/dashboard-scene/scene/ScopesDashboardsScene.tsx +++ b/public/app/features/dashboard-scene/scene/ScopesDashboardsScene.tsx @@ -7,7 +7,7 @@ import { getAppEvents, getBackendSrv } from '@grafana/runtime'; import { SceneComponentProps, SceneObjectBase, SceneObjectState } from '@grafana/scenes'; import { CustomScrollbar, Icon, Input, useStyles2 } from '@grafana/ui'; import { useQueryParams } from 'app/core/hooks/useQueryParams'; -import { ScopedResourceServer } from 'app/features/apiserver/server'; +import { ScopedResourceClient } from 'app/features/apiserver/client'; export interface ScopeDashboard { uid: string; @@ -25,7 +25,7 @@ export interface ScopesDashboardsSceneState extends SceneObjectState { export class ScopesDashboardsScene extends SceneObjectBase { static Component = ScopesDashboardsSceneRenderer; - private server = new ScopedResourceServer({ + private server = new ScopedResourceClient({ group: 'scope.grafana.app', version: 'v0alpha1', resource: 'scopedashboardbindings', diff --git a/public/app/features/dashboard-scene/scene/ScopesFiltersScene.tsx b/public/app/features/dashboard-scene/scene/ScopesFiltersScene.tsx index 3600da65c7b..ff95952ab94 100644 --- a/public/app/features/dashboard-scene/scene/ScopesFiltersScene.tsx +++ b/public/app/features/dashboard-scene/scene/ScopesFiltersScene.tsx @@ -11,7 +11,7 @@ import { SceneObjectUrlValues, } from '@grafana/scenes'; import { Checkbox, Icon, Input, Toggletip, useStyles2 } from '@grafana/ui'; -import { ScopedResourceServer } from 'app/features/apiserver/server'; +import { ScopedResourceClient } from 'app/features/apiserver/client'; export interface Node { item: ScopeTreeItemSpec; @@ -34,7 +34,7 @@ export class ScopesFiltersScene extends SceneObjectBase private serverVersion = 'v0alpha1'; private serverNamespace = 'default'; - private server = new ScopedResourceServer({ + private server = new ScopedResourceClient({ group: this.serverGroup, version: this.serverVersion, resource: 'scopes', diff --git a/public/app/features/playlist/api.ts b/public/app/features/playlist/api.ts index 48b83403b3a..25033582d50 100644 --- a/public/app/features/playlist/api.ts +++ b/public/app/features/playlist/api.ts @@ -8,8 +8,8 @@ import { getGrafanaDatasource } from 'app/plugins/datasource/grafana/datasource' import { GrafanaQuery, GrafanaQueryType } from 'app/plugins/datasource/grafana/types'; import { dispatch } from 'app/store/store'; -import { ScopedResourceServer } from '../apiserver/server'; -import { Resource, ResourceForCreate, ResourceServer } from '../apiserver/types'; +import { ScopedResourceClient } from '../apiserver/client'; +import { Resource, ResourceForCreate, ResourceClient } from '../apiserver/types'; import { DashboardQueryResult, getGrafanaSearcher, SearchQuery } from '../search/service'; import { Playlist, PlaylistItem, PlaylistAPI } from './types'; @@ -47,10 +47,10 @@ interface PlaylistSpec { type K8sPlaylist = Resource; class K8sAPI implements PlaylistAPI { - readonly server: ResourceServer; + readonly server: ResourceClient; constructor() { - this.server = new ScopedResourceServer({ + this.server = new ScopedResourceClient({ group: 'playlist.grafana.app', version: 'v0alpha1', resource: 'playlists',