diff --git a/apiversion.png b/apiversion.png index 0880d99a..395c7c55 100644 Binary files a/apiversion.png and b/apiversion.png differ diff --git a/src/Objects/MarketplacePlan.ts b/src/Objects/MarketplacePlan.ts new file mode 100644 index 00000000..2fedd0fb --- /dev/null +++ b/src/Objects/MarketplacePlan.ts @@ -0,0 +1,71 @@ +import { GridscaleObjects } from './GridscaleObjects'; +import { APIClass, ApiResult, RequestOptions, VoidApiResult } from '../api'; +import { MarketplaceNamedVersion } from './MarketplaceService'; + + +export type MarketplaceProductInterval = 'minute' | 'hour' | 'day' | 'month' | 'quarter' | 'year'; +export type MarketplaceProductType = 'subscription' | 'metered'; + +export interface MarketplaceProductExcerpt { + type: 'product_excerpt'; + id: string; + attributes: { + interval: MarketplaceProductInterval; + price_per_interval_in_euro_cent: number; + type: MarketplaceProductType; + }; + links: { + self?: string; + } +} + +export interface MarketplacePlanDetailResponse { + data: MarketplacePlanDetailData; + included: ( + MarketplaceNamedVersion | MarketplaceProductExcerpt + )[] +} + +export interface MarketplacePlanDetailAttributes { + plan_key: string; + name: string; + terms_of_use: string; + description: string; + features: string[]; + state: 'private' | 'archived' | 'public' | 'deleted'; + allow_updates_from: string[]; +} + +export interface MarketplacePlanDetailData { + attributes: MarketplacePlanDetailAttributes; + id: string; + type: 'detailed_plan'; + relationships: { + version: { + data: { + id: string; + type: 'named_version'; + } + }; + product_excerpts: { + data: { + id: string; + type: 'product_excerpt' + }[] + } + } +} + +interface MarketplacePlan { + get( + _uuid: string, + _callback?: Function + ): Promise>; +} +class MarketplacePlan extends GridscaleObjects { + constructor(_api: APIClass) { + super(_api, '/marketplace/v1/plans'); + } +} + +export { MarketplacePlan }; diff --git a/src/Objects/MarketplaceService.ts b/src/Objects/MarketplaceService.ts new file mode 100644 index 00000000..8aa9751d --- /dev/null +++ b/src/Objects/MarketplaceService.ts @@ -0,0 +1,134 @@ +import { GridscaleObjects } from './GridscaleObjects'; +import { APIClass, ApiResult, RequestOptions } from '../api'; + +export interface MarketplaceNamedPlan { + type: 'named_plan'; + id: string; + attributes: { + name: string; + }; + links: { + self?: string; + }; +} + +export interface MarketplaceServiceListRow { + attributes: { + name: string; + category_name: string; + links: { + linkServiceDetails: string + }; + logo: string; + state: string; + vendor_name: string; + description?: string; + }; + id: string; + type: string; +} + + + +export interface MarketplaceServiceListResponse { + data: MarketplaceServiceListRow[], + links: { + first: string; + last: string; + next: string; + prev: string; + self: string; + }; + meta: { + count: string; + limit: string; + page: string; + total: string; + }; +} + +export interface MarketplaceServiceDetailData { + attributes: { + name: string; + description: string; + category_name: string; + logo: string; + state: string; + }; + id: string; + type: 'services'; + relationships: { + vendor?: { + data: { + id: string, + type: 'vendors', + } + }, + named_versions?: { + data: [ + { + id: string, + type: 'named_version', + } + ] + } + } +} + +export interface MarketplaceVendorAttributes { + name: string; + description: string; + support_contact_uuid: string; + legal_contact_uuid: string; + partner_uuid: string; +} + +export interface MarketplaceNamedVersion { + type: 'named_version'; + id: string; + attributes: MarketplaceNamedVersionAttributes; + links: { + self?: string; + } +} +export interface MarketplaceNamedVersionAttributes { + name: string; +} + +export interface MarketplaceServiceDetailVendor { + attributes: MarketplaceVendorAttributes; + id: string; + type: 'vendors'; +} + + + +export interface MarketplaceServiceDetailResponse { + data: MarketplaceServiceDetailData; + included: ( + MarketplaceServiceDetailVendor | MarketplaceNamedVersion + )[]; + links: { + self?: string; + relatedVersions?: string; + } +} + + +interface MarketplaceService { + list( + _options?: RequestOptions, + _callback?: Function + ): Promise>; + get( + _uuid: string, + _callback?: Function + ): Promise>; +} +class MarketplaceService extends GridscaleObjects { + constructor(_api: APIClass) { + super(_api, '/marketplace/v1/services'); + } +} + +export { MarketplaceService }; diff --git a/src/Objects/MarketplaceServiceInstance.ts b/src/Objects/MarketplaceServiceInstance.ts new file mode 100644 index 00000000..42cec4b8 --- /dev/null +++ b/src/Objects/MarketplaceServiceInstance.ts @@ -0,0 +1,171 @@ +import { GridscaleObjects } from './GridscaleObjects'; +import { APIClass, ApiResult, RequestOptions } from '../api'; + +export interface MarketplaceServiceInstanceCreateResult { + links?: null; + data?: { + type: "service_instances", + id: string; + attributes?: { + service_uuid: string; + plan_uuid: string; + version_uuid: string; + release_uuid: string; + name: string; + state: string; + settings: null; + properties: null; + } + }; + included?: null; + request_uuid?: string; + object_uuid?: string; +} + +export interface MarketplaceServiceInstanceDataRow { + type: "service_instances_list"; + id: string; + attributes?: { + name: string; + state: string; + links?: { + linkServiceInstanceDetail?: string; + } + } +} + +export interface MarketplaceServiceInstanceListResponse { + links?: { + self?: string; + first?: string; + prev?: string; + next?: string; + last?: string; + }, + data?: MarketplaceServiceInstanceDataRow[]; + meta?: { + count?: string; + limit?: string; + page?: string; + total?: string; + } +} + +export interface MarketplaceServiceInstanceDetailData { + type: "service_instances"; + id: string; + attributes?: { + service_uuid?: string; + plan_uuid?: string; + version_uuid?: string; + release_uuid?: string; + name?: string; + state?: string; + settings?: null; + properties?: null; + } +} + +export interface MarketplaceServiceInstanceDetailResponse { + links?: null; + data?: MarketplaceServiceInstanceDetailData; + included?: null; +} + + + + +class MarketplaceServiceInstance extends GridscaleObjects { + constructor(_api: APIClass) { + super(_api, '/marketplace/v1/projects'); + } + + /** + * Create a new service instance + */ + create(_attributes: { + name: string; + service_uuid: string; + plan_uuid: string; + version_uuid: string; + location_uuid: string; + contract_uuid: string; + project_uuid: string; + release_uuid: string; + vendor_keys: Record; + settings: Record; + }, _callback?: (response: Response, result: ApiResult) => void) { + return new Promise>((resolve, reject) => { + (this._api.post(this._basepath + '/' + _attributes.project_uuid + '/service-instances', _attributes, _callback) as Promise>) + .then(res => { + if (res.result?.data?.id) { + resolve({ + ...res, + result: { + ...res.result, + object_uuid: res.result.data.id, + request_uuid: res.response.headers.get('x-correlate-id') + } + }); + } else { + reject(new Error('unknown response')); + } + + }) + .catch(e => reject(e)); + }); + } + + /** + * @deprecated please use `listInstances` method for this object type + */ + list(_options?: RequestOptions, _callback?: (response: Response, result: ApiResult) => void): Promise> { + return new Promise>((resolve, reject) => { + reject(new Error('Unsupported method MarketplaceServiceInstance.list: Please use `listInstances` method for this object type!')); + }); + } + + /** + * List service instances + */ + listInstances(_project_uuid?: string, _options?: RequestOptions, _callback?: (response: Response, result: ApiResult) => void): Promise> { + // Get Defaults + const requestOptions = this._buildRequestOptions(_options); + + return this._api.get(this._basepath + '/' + _project_uuid + '/service-instances', requestOptions, _callback); + } + + /** + * @deprecated: Please use `getInstance` method for this object type + */ + get(_uuid: string, _callback?: (response: Response, result: ApiResult) => void): Promise> { + return new Promise>((resolve, reject) => { + reject(new Error('Unsupported method MarketplaceServiceInstance.list: Please use `getInstance` method for this object type!')); + }); + } + + /** + * get service instance detail + */ + getInstance(_project_uuid: string, _uuid: string, _callback?: (response: Response, result: ApiResult) => void): Promise> { + return this._api.get(this._basepath + '/' + _project_uuid + '/service-instances/' + _uuid, {}, _callback); + } + + /** + * @deprecated: Please use `requestDeleteInstance` method for this object type + */ + remove(_uuid: string, _callback?: (response: Response, result: ApiResult) => void): Promise> { + return new Promise>((resolve, reject) => { + reject(new Error('Unsupported method MarketplaceServiceInstance.list: Please use `requestDeleteInstance` method for this object type!')); + }); + } + + /** + * request deletion of the instance + */ + requestDeleteInstance(_project_uuid: string, _uuid: string, _callback?: (response: Response, result: ApiResult) => void): Promise> { + return this._api.remove(this._basepath + '/' + _project_uuid + '/service-instances/' + _uuid, _callback); + } +} + +export { MarketplaceServiceInstance }; diff --git a/src/Objects/MarketplaceVersion.ts b/src/Objects/MarketplaceVersion.ts new file mode 100644 index 00000000..ef29aef1 --- /dev/null +++ b/src/Objects/MarketplaceVersion.ts @@ -0,0 +1,63 @@ +import { GridscaleObjects } from './GridscaleObjects'; +import { APIClass, ApiResult, RequestOptions, VoidApiResult } from '../api'; +import { MarketplaceNamedPlan } from './MarketplaceService'; + + +export interface MarketplaceVersionDetailData { + id: string; + type: 'versions'; + attributes: { + version: string, + state: string; + }; + relationships: { + service: { + data: { + id: string; + type: 'services'; + } + }; + named_plans: { + data: { + id: string; + type: 'named_plan' + }[] + }; + } +} + + + +export interface MarketplaceVersionDetailResponse { + data: MarketplaceVersionDetailData; + included: ( + { + type: 'services'; + id: string; + attributes: { + name: string; + description: string; + logo_url: string; + category_name: string; + state: string; + } + } + | + MarketplaceNamedPlan + )[] +} + + +interface MarketplaceVersion { + get( + _uuid: string, + _callback?: Function + ): Promise>; +} +class MarketplaceVersion extends GridscaleObjects { + constructor(_api: APIClass) { + super(_api, '/marketplace/v1/versions'); + } +} + +export { MarketplaceVersion }; diff --git a/src/Specs/index.ts b/src/Specs/index.ts index 2a881a85..f5358395 100644 --- a/src/Specs/index.ts +++ b/src/Specs/index.ts @@ -167,7 +167,7 @@ export { PaasServiceParametersSchema } from './models/PaasServiceParametersSchem export { PaasServiceResourceLimit } from './models/PaasServiceResourceLimit'; export { PaasServiceResourceLimits } from './models/PaasServiceResourceLimits'; export { PaasServicesGetResponse } from './models/PaasServicesGetResponse'; -export { PaasServicesInNetwork } from './models/PaasServicesInNetwork'; +export { PaasServicesinNetwork } from './models/PaasServicesinNetwork'; export { PaasServicesUsage } from './models/PaasServicesUsage'; export { PaasServicesUsages } from './models/PaasServicesUsages'; export { PaasServiceTemplate } from './models/PaasServiceTemplate'; @@ -435,7 +435,7 @@ export { $PaasServiceParametersSchema } from './schemas/$PaasServiceParametersSc export { $PaasServiceResourceLimit } from './schemas/$PaasServiceResourceLimit'; export { $PaasServiceResourceLimits } from './schemas/$PaasServiceResourceLimits'; export { $PaasServicesGetResponse } from './schemas/$PaasServicesGetResponse'; -export { $PaasServicesInNetwork } from './schemas/$PaasServicesInNetwork'; +export { $PaasServicesinNetwork } from './schemas/$PaasServicesinNetwork'; export { $PaasServicesUsage } from './schemas/$PaasServicesUsage'; export { $PaasServicesUsages } from './schemas/$PaasServicesUsages'; export { $PaasServiceTemplate } from './schemas/$PaasServiceTemplate'; diff --git a/src/Specs/models/NetworkRelation.ts b/src/Specs/models/NetworkRelation.ts index 9fb420d9..4b783128 100644 --- a/src/Specs/models/NetworkRelation.ts +++ b/src/Specs/models/NetworkRelation.ts @@ -3,7 +3,7 @@ /* eslint-disable */ import { PaasSecurityZonesinNetwork } from './PaasSecurityZonesinNetwork'; -import { PaasServicesInNetwork } from './PaasServicesInNetwork'; +import { PaasServicesinNetwork } from './PaasServicesinNetwork'; import { ServerinNetwork } from './ServerinNetwork'; import { VlansinNetwork } from './VlansinNetwork'; @@ -14,5 +14,5 @@ export type NetworkRelation = { servers?: ServerinNetwork; vlans?: VlansinNetwork; paas_security_zones?: PaasSecurityZonesinNetwork; - paas_services?: PaasServicesInNetwork; + paas_services?: PaasServicesinNetwork; } diff --git a/src/Specs/models/PaasServicesInNetwork.ts b/src/Specs/models/PaasServicesInNetwork.ts index 30bb7885..35403229 100644 --- a/src/Specs/models/PaasServicesInNetwork.ts +++ b/src/Specs/models/PaasServicesInNetwork.ts @@ -4,7 +4,7 @@ import { ListenPortsByIpIndex } from './ListenPortsByIpIndex'; -export type PaasServicesInNetwork = Array<{ +export type PaasServicesinNetwork = Array<{ /** * The human-readable name of the object. It supports the full UTF-8 character set, with a maximum of 64 characters. */ diff --git a/src/Specs/models/Server.ts b/src/Specs/models/Server.ts index 553f8fb2..a0d33f51 100644 --- a/src/Specs/models/Server.ts +++ b/src/Specs/models/Server.ts @@ -94,4 +94,18 @@ export type Server = { * Status indicates the status of the object, e.g., in-provisioning or active. */ status?: string; + hardware_profile_config?: { + machinetype?: 'i440fx' | 'q35_bios' | 'q35_uefi', + storage_device?: 'ide' | 'sata' | 'virtio_scsi' | 'virtio_block', + usb_controller?: 'nec_xhci' | 'piix3_uhci', + nested_virtualization?: boolean, + hyperv_extensions?: boolean, + network_model?: 'e1000' | 'e1000e' | 'virtio' | 'vmxnet3', + serial_interface?: boolean, + server_renice?: boolean, + }; + /** + * For system configuration on first boot. May contain cloud-config data or shell scripting, encoded as base64 string. Supported tools are cloud-init, Cloudbase-init, and Ignition. + */ + user_data?: string; } diff --git a/src/Specs/models/ServerCreate.ts b/src/Specs/models/ServerCreate.ts index b6b51556..45e66f04 100644 --- a/src/Specs/models/ServerCreate.ts +++ b/src/Specs/models/ServerCreate.ts @@ -54,4 +54,8 @@ export type ServerCreate = { serial_interface?: boolean, server_renice?: boolean, }; + /** + * For system configuration on first boot. May contain cloud-config data or shell scripting, encoded as base64 string. Supported tools are cloud-init, Cloudbase-init, and Ignition. + */ + user_data?: string; } diff --git a/src/Specs/models/ServerUpdate.ts b/src/Specs/models/ServerUpdate.ts index d6855d62..1679fe8f 100644 --- a/src/Specs/models/ServerUpdate.ts +++ b/src/Specs/models/ServerUpdate.ts @@ -50,4 +50,8 @@ export type ServerUpdate = { serial_interface?: boolean, server_renice?: boolean, }; + /** + * For system configuration on first boot. May contain cloud-config data or shell scripting, encoded as base64 string. Supported tools are cloud-init, Cloudbase-init, and Ignition. + */ + user_data?: string; } diff --git a/src/Specs/schemas/$NetworkRelation.ts b/src/Specs/schemas/$NetworkRelation.ts index d47681f3..fdff5fac 100644 --- a/src/Specs/schemas/$NetworkRelation.ts +++ b/src/Specs/schemas/$NetworkRelation.ts @@ -13,7 +13,7 @@ export const $NetworkRelation = { type: 'PaasSecurityZonesinNetwork', }, paas_services: { - type: 'PaasServicesInNetwork', + type: 'PaasServicesinNetwork', }, }, }; \ No newline at end of file diff --git a/src/Specs/schemas/$PaasServicesInNetwork.ts b/src/Specs/schemas/$PaasServicesInNetwork.ts index cd511066..87949f25 100644 --- a/src/Specs/schemas/$PaasServicesInNetwork.ts +++ b/src/Specs/schemas/$PaasServicesInNetwork.ts @@ -1,7 +1,7 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -export const $PaasServicesInNetwork = { +export const $PaasServicesinNetwork = { type: 'array', contains: { properties: { diff --git a/src/Specs/schemas/$Server.ts b/src/Specs/schemas/$Server.ts index c76ca999..769e7594 100644 --- a/src/Specs/schemas/$Server.ts +++ b/src/Specs/schemas/$Server.ts @@ -85,5 +85,37 @@ export const $Server = { status: { type: 'string', }, + hardware_profile_config: { + properties: { + machinetype: { + type: 'Enum', + }, + storage_device: { + type: 'Enum', + }, + usb_controller: { + type: 'Enum', + }, + nested_virtualization: { + type: 'boolean', + }, + hyperv_extensions: { + type: 'boolean', + }, + network_model: { + type: 'Enum', + }, + serial_interface: { + type: 'boolean', + }, + server_renice: { + type: 'boolean', + }, + }, + }, + user_data: { + type: 'string', + format: 'byte', + }, }, }; \ No newline at end of file diff --git a/src/Specs/schemas/$ServerCreate.ts b/src/Specs/schemas/$ServerCreate.ts index ba4bd86b..833cbc23 100644 --- a/src/Specs/schemas/$ServerCreate.ts +++ b/src/Specs/schemas/$ServerCreate.ts @@ -61,5 +61,9 @@ export const $ServerCreate = { }, }, }, + user_data: { + type: 'string', + format: 'byte', + }, }, }; \ No newline at end of file diff --git a/src/Specs/schemas/$ServerUpdate.ts b/src/Specs/schemas/$ServerUpdate.ts index 98cc92fe..bbd0e45a 100644 --- a/src/Specs/schemas/$ServerUpdate.ts +++ b/src/Specs/schemas/$ServerUpdate.ts @@ -55,5 +55,9 @@ export const $ServerUpdate = { }, }, }, + user_data: { + type: 'string', + format: 'byte', + }, }, }; \ No newline at end of file diff --git a/src/client.ts b/src/client.ts index 26045e05..3ed24a99 100644 --- a/src/client.ts +++ b/src/client.ts @@ -23,6 +23,10 @@ import { MarketplaceApplication } from './Objects/MarketplaceApplication'; import { Certificate } from './Objects/Certificate'; import { forEach } from 'lodash'; import { BackupLocation } from './Objects/BackupLocation'; +import { MarketplaceService } from './Objects/MarketplaceService'; +import { MarketplacePlan } from './Objects/MarketplacePlan'; +import { MarketplaceVersion } from './Objects/MarketplaceVersion'; +import { MarketplaceServiceInstance } from './Objects/MarketplaceServiceInstance'; /** * generate Client Class for all Connections @@ -55,6 +59,10 @@ class GridscaleClient { public PaasSecurityZone: PaasSecurityZone; public Deleted: Deleted; public MarketplaceApplication: MarketplaceApplication; + public MarketplaceService: MarketplaceService; + public MarketplaceServiceInstance: MarketplaceServiceInstance; + public MarketplacePlan: MarketplacePlan; + public MarketplaceVersion: MarketplaceVersion; public watchRequest: (_requestid: string) => ReturnType; @@ -94,6 +102,10 @@ class GridscaleClient { this.PaasSecurityZone = new PaasSecurityZone(api); this.Deleted = new Deleted(api); this.MarketplaceApplication = new MarketplaceApplication(api); + this.MarketplaceService = new MarketplaceService(api); + this.MarketplaceServiceInstance = new MarketplaceServiceInstance(api); + this.MarketplacePlan = new MarketplacePlan(api); + this.MarketplaceVersion = new MarketplaceVersion(api); this.Certificate = new Certificate(api); this.BackupLocation = new BackupLocation(api); this.watchRequest = api.watchRequest.bind(api);