Product license verification in Console (#518)

Operator UI - Provide and store License key
- New License section in Operator UI will allow user to provide the
  license key via input form
- New License section in Operator UI will allow the user to fetch the
  license key using subnet credentials
-  Console backend has to verify provided license is valid -
   https://godoc.org/github.com/minio/minio/pkg/licverifier#example-package
-  Console backend has to store the license key in k8s secrets

Operator UI - Set license to tenant during provisioning
- Check if license key exists in k8s secret during tenant creation
- If License is present attach the license-key jwt to the new console
tenant via an environment variable

Operator UI - Set license for an existing tenant
- Tenant view will display information about the current status of the
  Tenant License
- If Tenant doesn't have a License then Operator-UI will allow to attach
new license by clicking the Add License button
- Console backend will extract the license from the k8s secret and save
the license-key jwt in the tenant console environment variable and
redeploy
This commit is contained in:
Lenin Alevski
2021-01-12 15:55:07 -06:00
committed by GitHub
parent fd779c2ffa
commit f3bcfc327d
69 changed files with 4293 additions and 221 deletions

View File

@@ -2631,6 +2631,96 @@ func init() {
}
}
},
"/subscription/info": {
"get": {
"tags": [
"AdminAPI"
],
"summary": "Subscription info",
"operationId": "SubscriptionInfo",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/license"
}
},
"default": {
"description": "Generic error response.",
"schema": {
"$ref": "#/definitions/error"
}
}
}
}
},
"/subscription/namespaces/{namespace}/tenants/{tenant}/activate": {
"post": {
"tags": [
"AdminAPI"
],
"summary": "Activate a particular tenant using the existing subscription license",
"operationId": "SubscriptionActivate",
"parameters": [
{
"type": "string",
"name": "namespace",
"in": "path",
"required": true
},
{
"type": "string",
"name": "tenant",
"in": "path",
"required": true
}
],
"responses": {
"204": {
"description": "A successful response."
},
"default": {
"description": "Generic error response.",
"schema": {
"$ref": "#/definitions/error"
}
}
}
}
},
"/subscription/validate": {
"post": {
"tags": [
"AdminAPI"
],
"summary": "Validate a provided subscription license",
"operationId": "SubscriptionValidate",
"parameters": [
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/subscriptionValidateRequest"
}
}
],
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/license"
}
},
"default": {
"description": "Generic error response.",
"schema": {
"$ref": "#/definitions/error"
}
}
}
}
},
"/tenants": {
"get": {
"tags": [
@@ -3726,6 +3816,29 @@ func init() {
}
}
},
"license": {
"type": "object",
"properties": {
"account_id": {
"type": "integer"
},
"email": {
"type": "string"
},
"expires_at": {
"type": "string"
},
"organization": {
"type": "string"
},
"plan": {
"type": "string"
},
"storage_capacity": {
"type": "integer"
}
}
},
"listBucketEventsResponse": {
"type": "object",
"properties": {
@@ -4754,6 +4867,9 @@ func init() {
"sessionResponse": {
"type": "object",
"properties": {
"operator": {
"type": "boolean"
},
"pages": {
"type": "array",
"items": {
@@ -4923,6 +5039,20 @@ func init() {
}
}
},
"subscriptionValidateRequest": {
"type": "object",
"properties": {
"email": {
"type": "string"
},
"license": {
"type": "string"
},
"password": {
"type": "string"
}
}
},
"tenant": {
"type": "object",
"properties": {
@@ -4956,6 +5086,9 @@ func init() {
"$ref": "#/definitions/pool"
}
},
"subnet_license": {
"$ref": "#/definitions/license"
},
"total_size": {
"type": "integer",
"format": "int64"
@@ -7792,6 +7925,96 @@ func init() {
}
}
},
"/subscription/info": {
"get": {
"tags": [
"AdminAPI"
],
"summary": "Subscription info",
"operationId": "SubscriptionInfo",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/license"
}
},
"default": {
"description": "Generic error response.",
"schema": {
"$ref": "#/definitions/error"
}
}
}
}
},
"/subscription/namespaces/{namespace}/tenants/{tenant}/activate": {
"post": {
"tags": [
"AdminAPI"
],
"summary": "Activate a particular tenant using the existing subscription license",
"operationId": "SubscriptionActivate",
"parameters": [
{
"type": "string",
"name": "namespace",
"in": "path",
"required": true
},
{
"type": "string",
"name": "tenant",
"in": "path",
"required": true
}
],
"responses": {
"204": {
"description": "A successful response."
},
"default": {
"description": "Generic error response.",
"schema": {
"$ref": "#/definitions/error"
}
}
}
}
},
"/subscription/validate": {
"post": {
"tags": [
"AdminAPI"
],
"summary": "Validate a provided subscription license",
"operationId": "SubscriptionValidate",
"parameters": [
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/subscriptionValidateRequest"
}
}
],
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/license"
}
},
"default": {
"description": "Generic error response.",
"schema": {
"$ref": "#/definitions/error"
}
}
}
}
},
"/tenants": {
"get": {
"tags": [
@@ -9410,6 +9633,29 @@ func init() {
}
}
},
"license": {
"type": "object",
"properties": {
"account_id": {
"type": "integer"
},
"email": {
"type": "string"
},
"expires_at": {
"type": "string"
},
"organization": {
"type": "string"
},
"plan": {
"type": "string"
},
"storage_capacity": {
"type": "integer"
}
}
},
"listBucketEventsResponse": {
"type": "object",
"properties": {
@@ -10303,6 +10549,9 @@ func init() {
"sessionResponse": {
"type": "object",
"properties": {
"operator": {
"type": "boolean"
},
"pages": {
"type": "array",
"items": {
@@ -10472,6 +10721,20 @@ func init() {
}
}
},
"subscriptionValidateRequest": {
"type": "object",
"properties": {
"email": {
"type": "string"
},
"license": {
"type": "string"
},
"password": {
"type": "string"
}
}
},
"tenant": {
"type": "object",
"properties": {
@@ -10505,6 +10768,9 @@ func init() {
"$ref": "#/definitions/pool"
}
},
"subnet_license": {
"$ref": "#/definitions/license"
},
"total_size": {
"type": "integer",
"format": "int64"