ResourceClient: Add generateName (eg UID) helper (#88037)

This commit is contained in:
Ryan McKinley 2024-05-20 12:18:53 +03:00 committed by GitHub
parent f3be9d009e
commit e8b7b6aa66
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 18 additions and 12 deletions

View File

@ -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<T = object, K = string> implements ResourceServer<T, K> {
export class ScopedResourceClient<T = object, K = string> implements ResourceClient<T, K> {
readonly url: string;
constructor(gvr: GroupVersionResource, namespaced = true) {
@ -27,6 +27,9 @@ export class ScopedResourceServer<T = object, K = string> implements ResourceSer
}
public async create(obj: ResourceForCreate<T, K>): Promise<void> {
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);
}

View File

@ -63,7 +63,10 @@ export interface Resource<T = object, K = string> extends TypeMeta<K> {
}
export interface ResourceForCreate<T = object, K = string> extends Partial<TypeMeta<K>> {
metadata: Partial<ObjectMeta>;
metadata: Partial<ObjectMeta> & {
// 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<T = object, K = string> {
export interface ResourceClient<T = object, K = string> {
create(obj: ResourceForCreate<T, K>): Promise<void>;
get(name: string): Promise<Resource<T, K>>;
list(opts?: ListOptions): Promise<ResourceList<T, K>>;

View File

@ -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<ScopesDashboardsSceneState> {
static Component = ScopesDashboardsSceneRenderer;
private server = new ScopedResourceServer<ScopeDashboardBindingSpec, 'ScopeDashboardBinding'>({
private server = new ScopedResourceClient<ScopeDashboardBindingSpec, 'ScopeDashboardBinding'>({
group: 'scope.grafana.app',
version: 'v0alpha1',
resource: 'scopedashboardbindings',

View File

@ -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<ScopesFiltersSceneState>
private serverVersion = 'v0alpha1';
private serverNamespace = 'default';
private server = new ScopedResourceServer<ScopeSpec, 'Scope'>({
private server = new ScopedResourceClient<ScopeSpec, 'Scope'>({
group: this.serverGroup,
version: this.serverVersion,
resource: 'scopes',

View File

@ -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<PlaylistSpec>;
class K8sAPI implements PlaylistAPI {
readonly server: ResourceServer<PlaylistSpec>;
readonly server: ResourceClient<PlaylistSpec>;
constructor() {
this.server = new ScopedResourceServer<PlaylistSpec>({
this.server = new ScopedResourceClient<PlaylistSpec>({
group: 'playlist.grafana.app',
version: 'v0alpha1',
resource: 'playlists',