diff --git a/content/en/plugins/scale-agent/release-notes/agent-plugin/agent-plug-v-0-13-9.md b/content/en/plugins/scale-agent/release-notes/agent-plugin/agent-plug-v-0-13-9.md new file mode 100644 index 0000000000..915a16d946 --- /dev/null +++ b/content/en/plugins/scale-agent/release-notes/agent-plugin/agent-plug-v-0-13-9.md @@ -0,0 +1,13 @@ +--- +title: v0.13.9 Armory Agent Clouddriver Plugin (2023-08-02) +toc_hide: true +version: 00.13.09 +date: 2023-08-02 +--- + +Features: +- Notify agent that it could turn on the restart connection job if operations has not been received by it (enable since agent 1.0.59) +Fixes: +- Prevent to deleting accounts and it's cache due to zero connections on `kubesvc_accounts` table; this work was delegated to cleanup job which delete expired accounts base on the `kubesvc.cache.accountCleanupFrequencySeconds` property (10 minutes by default) +Changes: +- Switch from thread pool executor to scheduled annotation for the agent liveness probe job; since it has better improvement diff --git a/static/reference/scale-agent/swagger.0.13.9.json b/static/reference/scale-agent/swagger.0.13.9.json new file mode 100644 index 0000000000..55f04fd98b --- /dev/null +++ b/static/reference/scale-agent/swagger.0.13.9.json @@ -0,0 +1 @@ +{"swagger":"2.0","info":{"description":"Cloud read and write operations","title":"clouddriver","contact":{"name":"admin@host.net"}},"host":"localhost:7002","basePath":"/","tags":[{"name":"agent-accounts-controller","description":"Agent Accounts Controller"},{"name":"agent-operations-controller","description":"Agent Operations Controller"},{"name":"armory-accounts-controller","description":"Armory Accounts Controller"},{"name":"armory-agents-controller","description":"Armory Agents Controller"},{"name":"kubernetes-clouddriver-info-controller","description":"Kubernetes Clouddriver Info Controller"}],"paths":{"/agents/kubernetes/accounts/{accountName}":{"get":{"tags":["agent-accounts-controller"],"summary":"Retrieve account by name if handled by armory agent","operationId":"getAccountUsingGET","produces":["*/*"],"parameters":[{"name":"accountName","in":"path","description":"accountName","required":true,"type":"string"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/KubesvcAccount"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}},"deprecated":false}},"/agents/kubernetes/accounts/{accountName}/namespaces":{"get":{"tags":["agent-accounts-controller"],"summary":"Retrieve namespaces by account name if handled by armory agent","operationId":"getNamespacesUsingGET","produces":["*/*"],"parameters":[{"name":"accountName","in":"path","description":"accountName","required":true,"type":"string"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"type":"string"}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}},"deprecated":false}},"/armory/accounts":{"post":{"tags":["armory-accounts-controller"],"summary":"Add account as inactive to dynamic accounts to be migrated to armory agent later with a patch operation","operationId":"addAccountsUsingPOST","consumes":["application/json"],"produces":["*/*"],"parameters":[{"in":"body","name":"addAgentAccountRequest","description":"addAgentAccountRequest","required":true,"schema":{"type":"array","items":{"$ref":"#/definitions/AddAgentAccountRequest"}}}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/AddAgentAccountRequest"}}},"201":{"description":"Created"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}},"deprecated":false},"delete":{"tags":["armory-accounts-controller"],"summary":"Remove dynamic accounts from armory agent by name. It will stop being handled by armory agent","operationId":"deleteAccountsUsingDELETE","produces":["*/*"],"parameters":[{"in":"body","name":"accountNames","description":"accountNames","required":true,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"OK"},"204":{"description":"No Content"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"}},"deprecated":false},"patch":{"tags":["armory-accounts-controller"],"summary":"Set a dynamic account to become active or inactive. Active accounts will be migrated to armory agent","operationId":"patchAccountsUsingPATCH","consumes":["application/json"],"produces":["*/*"],"parameters":[{"in":"body","name":"addAgentAccountRequests","description":"addAgentAccountRequests","required":true,"schema":{"type":"array","items":{"$ref":"#/definitions/AddAgentAccountRequest"}}}],"responses":{"200":{"description":"OK"},"204":{"description":"No Content"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"}},"deprecated":false}},"/armory/accounts/dynamic":{"post":{"tags":["armory-accounts-controller"],"summary":"Creates a dynamic account from armory agent from json definition","operationId":"createAccountsUsingPOST","consumes":["application/json"],"produces":["*/*"],"parameters":[{"in":"body","name":"request","description":"request","required":true,"schema":{"$ref":"#/definitions/JsonNode"}}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"type":"object"}}},"201":{"description":"Created"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}},"deprecated":false},"put":{"tags":["armory-accounts-controller"],"summary":"Updates a dynamic account from armory agent by object definition","operationId":"updateAccountUsingPUT","consumes":["application/json"],"produces":["*/*"],"parameters":[{"in":"body","name":"request","description":"request","required":true,"schema":{"$ref":"#/definitions/JsonNode"}}],"responses":{"200":{"description":"OK","schema":{"type":"object"}},"201":{"description":"Created"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}},"deprecated":false}},"/armory/accounts/{accountName}":{"get":{"tags":["armory-accounts-controller"],"summary":"Retrieves a dynamic account from armory agent by name","operationId":"getAccountUsingGET_1","produces":["*/*"],"parameters":[{"name":"accountName","in":"path","description":"accountName","required":true,"type":"string"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ObjectNode"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}},"deprecated":false},"delete":{"tags":["armory-accounts-controller"],"summary":"Remove a dynamic account from armory agent by name. It will stop being handled by armory agent","operationId":"deleteAccountUsingDELETE","produces":["*/*"],"parameters":[{"name":"accountName","in":"path","description":"accountName","required":true,"type":"string"}],"responses":{"200":{"description":"OK"},"204":{"description":"No Content"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"}},"deprecated":false}},"/armory/agent/assignments":{"post":{"tags":["agent-operations-controller"],"summary":"Manually marks accounts to be cached by any current available armory agent","operationId":"postAssignmentsUsingPOST","consumes":["application/json"],"produces":["*/*"],"parameters":[{"in":"body","name":"accountNames","description":"accountNames","required":true,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"OK"},"201":{"description":"Created"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}},"deprecated":false}},"/armory/agent/operationresults":{"post":{"tags":["agent-operations-controller"],"summary":"Manually set a operation result that should have been handled by armory agent","operationId":"postOperationResultUsingPOST","consumes":["application/json"],"produces":["*/*"],"parameters":[{"in":"body","name":"result","description":"result","required":true,"schema":{"$ref":"#/definitions/OperationResultRequest"}}],"responses":{"200":{"description":"OK"},"201":{"description":"Created"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}},"deprecated":false}},"/armory/agent/operations":{"get":{"tags":["agent-operations-controller"],"summary":"Retrieve pending kubernetes operations to be handled by armory agent","operationId":"getAllUsingGET_1","produces":["*/*"],"parameters":[{"name":"items","in":"query","description":"items","required":false,"type":"integer","format":"int32","allowEmptyValue":false,"x-example":1},{"name":"page","in":"query","description":"page","required":false,"type":"integer","format":"int32","allowEmptyValue":false,"x-example":1}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/OperationHistoryRecord"}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}},"deprecated":false},"post":{"tags":["agent-operations-controller"],"summary":"Send an operation payload directly to armory agent","operationId":"postOperationUsingPOST","consumes":["application/json"],"produces":["*/*"],"parameters":[{"in":"body","name":"operation","description":"operation","required":true,"schema":{"$ref":"#/definitions/OperationRequest"}}],"responses":{"200":{"description":"OK"},"201":{"description":"Created"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}},"deprecated":false}},"/armory/agent/operations/{opId}":{"get":{"tags":["agent-operations-controller"],"summary":"Retrieve a pending kubernetes operation to ba handled by armory agent","operationId":"getAllUsingGET","produces":["*/*"],"parameters":[{"name":"opId","in":"path","description":"operation id to query","required":false,"type":"string"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/OperationHistoryRecord"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}},"deprecated":false}},"/armory/agent/{agentId}/disconnect":{"post":{"tags":["agent-operations-controller"],"summary":"Disconnect operations and caching","operationId":"postAgentDisconnectUsingPOST","consumes":["application/json"],"produces":["*/*"],"parameters":[{"name":"agentId","in":"path","description":"agentId","required":true,"type":"string"},{"in":"body","name":"request","description":"request","required":true,"schema":{"$ref":"#/definitions/DisconnectRequest"}}],"responses":{"200":{"description":"OK"},"201":{"description":"Created"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}},"deprecated":false}},"/armory/agents":{"get":{"tags":["armory-agents-controller"],"summary":"Retrieve agents currently connected to this clouddriver cluster","operationId":"getAgentsUsingGET","produces":["*/*"],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/ArmoryAgentResponse"}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}},"deprecated":false}},"/armory/agents/{agentId}":{"get":{"tags":["armory-agents-controller"],"summary":"Retrieve by name an armory agent connected to this cluster","operationId":"getAgentUsingGET","produces":["*/*"],"parameters":[{"name":"agentId","in":"path","description":"agentId","required":true,"type":"string"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ArmoryAgentResponse"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}},"deprecated":false}},"/armory/clouddrivers":{"get":{"tags":["kubernetes-clouddriver-info-controller"],"summary":"Retrieve clouddriver instances that make current cluster","operationId":"getAllCLouddriversUsingGET","produces":["*/*"],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/ClouddriverInstance"}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}},"deprecated":false}},"/armory/clouddrivers/{clouddriverId}":{"get":{"tags":["kubernetes-clouddriver-info-controller"],"summary":"Retrieve by name a clouddriver instances from current cluster","operationId":"getOneClouddriverUsingGET","produces":["*/*"],"parameters":[{"name":"clouddriverId","in":"path","description":"clouddriverId","required":true,"type":"string"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ClouddriverInstance"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}},"deprecated":false}}},"definitions":{"AddAgentAccountRequest":{"type":"object","properties":{"kubeconfigFile":{"type":"string"},"name":{"type":"string"},"state":{"type":"string"},"zoneId":{"type":"string"}},"title":"AddAgentAccountRequest"},"ArmoryAgentResponse":{"type":"object","required":["accounts","agentId","caching","clouddriverId","lastConnection","type"],"properties":{"accounts":{"type":"array","items":{"type":"string"}},"agentId":{"type":"string"},"caching":{"type":"boolean"},"clouddriverId":{"type":"string"},"lastConnection":{"type":"string"},"type":{"type":"string"}},"title":"ArmoryAgentResponse"},"ClouddriverInstance":{"type":"object","properties":{"baseUrl":{"type":"string"},"id":{"type":"string"},"lastUpdated":{"type":"string"},"ready":{"type":"boolean"}},"title":"ClouddriverInstance"},"DisconnectRequest":{"type":"object","properties":{"clusterDriven":{"type":"boolean"},"origin":{"type":"string"},"timestamp":{"type":"integer","format":"int64"}},"title":"DisconnectRequest"},"JsonNode":{"type":"object","title":"JsonNode"},"KubesvcAccount":{"type":"object","required":["connections","definition","definitionAsString","name","permissions","properties","propertiesAsString"],"properties":{"certFingerprint":{"type":"string"},"connections":{"type":"integer","format":"int32"},"def":{"type":"string"},"definition":{"type":"object"},"definitionAsString":{"type":"string"},"dynamic":{"type":"boolean"},"errorMessage":{"type":"string"},"kubeHost":{"type":"string"},"kubeVersion":{"type":"string"},"lastUpdated":{"type":"integer","format":"int64"},"maxWatchAgeSeconds":{"type":"integer","format":"int64"},"name":{"type":"string"},"permissions":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}},"properties":{"type":"object"},"propertiesAsString":{"type":"string"},"props":{"type":"string"},"retryCount":{"type":"integer","format":"int32"},"status":{"type":"string","enum":["ACTIVATING","ACTIVE","DEACTIVATING","DELETING","FAILED","DELETE_FAILED","INACTIVE","TO_DEACTIVATE","TO_MIGRATE","ORPHANED"]},"zoneId":{"type":"string"}},"title":"KubesvcAccount"},"ObjectNode":{"type":"object","title":"ObjectNode"},"OperationAgent":{"type":"object","properties":{"agentId":{"type":"string"},"time":{"type":"string"}},"title":"OperationAgent"},"OperationCloudDriver":{"type":"object","properties":{"clouddriverId":{"type":"string"},"time":{"type":"string"}},"title":"OperationCloudDriver"},"OperationHistoryRecord":{"type":"object","properties":{"account":{"type":"string"},"endTime":{"type":"string"},"finalOutcome":{"type":"string"},"opProcessedByClouddriver":{"$ref":"#/definitions/OperationCloudDriver"},"opReceivedByClouddriver":{"$ref":"#/definitions/OperationCloudDriver"},"opSentToAgent":{"$ref":"#/definitions/OperationAgent"},"operationId":{"type":"string"},"operationType":{"type":"string"},"resultReceivedByClouddriver":{"$ref":"#/definitions/OperationCloudDriver"},"resultReceivedFromAgent":{"$ref":"#/definitions/OperationResultAgent"},"startTime":{"type":"string"},"totalDurationMs":{"type":"integer","format":"int64"}},"title":"OperationHistoryRecord"},"OperationHistoryResult":{"type":"object","properties":{"durationMs":{"type":"integer","format":"int64"},"status":{"type":"integer","format":"int32"}},"title":"OperationHistoryResult"},"OperationRequest":{"type":"object","properties":{"operation":{"type":"string"}},"title":"OperationRequest"},"OperationResultAgent":{"type":"object","properties":{"agentId":{"type":"string"},"clouddriverId":{"type":"string"},"result":{"$ref":"#/definitions/OperationHistoryResult"},"time":{"type":"string"}},"title":"OperationResultAgent"},"OperationResultRequest":{"type":"object","properties":{"result":{"type":"string"}},"title":"OperationResultRequest"}}} \ No newline at end of file