~ knotless Search/
↑↓ move↵ open⇧↵ all results
0
0
main
81 lines · 4.8 KB Raw History
{
  "lexicon": 1,
  "id": "computer.socialweb.k8s.kubectlApplyServerSide",
  "defs": {
    "main": {
      "type": "procedure",
      "description": "Server-side apply one Kubernetes object to the named cluster of the calling account, as `kubectl apply --server-side` would, without a kubeconfig. The gateway mints a short-lived token for the account's own ServiceAccount in that cluster (the same identity a kubeconfig from getKubeconfig carries) and sends the object as an apply patch (application/apply-patch+yaml) to the cluster's apiserver. Any kind the cluster serves works, CRDs included: the kind is resolved through the cluster's discovery. Requires a service-auth JWT from the caller's own PDS whose lxm is this method; the account is the verified token's iss. The cluster must be running and Ready.",
      "input": {
        "encoding": "application/json",
        "schema": {
          "type": "object",
          "required": ["cluster", "manifest"],
          "properties": {
            "cluster": {
              "type": "string",
              "description": "The cluster label of the calling account (as in createCluster). RFC-1123 label, <=63 characters."
            },
            "namespace": {
              "type": "string",
              "description": "The namespace of a namespaced object. Optional: metadata.namespace of the manifest, then this, then 'default'. When both are set they must be equal. A cluster-scoped kind takes no namespace."
            },
            "name": {
              "type": "string",
              "description": "Optional check: when set it must equal metadata.name of the manifest."
            },
            "fieldManager": {
              "type": "string",
              "description": "The server-side apply field manager. Default 'socialweb-computer'. Use one field manager per owner of a set of fields; the same value as a kubectl user ('kubectl') shares field ownership with kubectl apply --server-side."
            },
            "force": {
              "type": "boolean",
              "description": "Take ownership of fields another field manager owns (kubectl --force-conflicts). Without it such a field is an ApplyConflict."
            },
            "dryRun": {
              "type": "boolean",
              "description": "Run admission and validation and return the object the apply would write, without persisting it (dryRun=All)."
            },
            "manifest": {
              "type": "unknown",
              "description": "One Kubernetes object as JSON, with apiVersion, kind and metadata.name. A List kind or generateName is InvalidRequest."
            }
          }
        }
      },
      "output": {
        "encoding": "application/json",
        "schema": {
          "type": "object",
          "required": ["apiVersion", "kind", "name", "object"],
          "properties": {
            "apiVersion": { "type": "string" },
            "kind": { "type": "string" },
            "namespace": { "type": "string" },
            "name": { "type": "string" },
            "uid": { "type": "string" },
            "resourceVersion": { "type": "string" },
            "generation": { "type": "integer" },
            "dryRun": { "type": "boolean" },
            "object": {
              "type": "unknown",
              "description": "The object as the apiserver stored it (or would store it, on dryRun), managedFields included."
            }
          }
        }
      },
      "errors": [
        { "name": "InvalidRequest", "description": "The input is malformed, the manifest is not one object with apiVersion, kind and metadata.name, or the name or namespace checks fail." },
        { "name": "Unauthorized", "description": "Missing or invalid service-auth token, or its aud or lxm does not match." },
        { "name": "IdentityRevoked", "description": "The caller's identity carries a deny record." },
        { "name": "ClusterNotFound", "description": "This account has no cluster of that name." },
        { "name": "ClusterNotRunning", "description": "The control plane is stopped (409). Call controlPlaneUp first." },
        { "name": "ClusterInitializing", "description": "The control plane is coming up (429, Retry-After). Retry." },
        { "name": "ClusterDraining", "description": "The cluster is being deleted (409)." },
        { "name": "ClusterUnavailable", "description": "The gateway could not get a credential for the cluster or the cluster did not answer (503)." },
        { "name": "KindNotFound", "description": "The cluster serves no such apiVersion and kind (400)." },
        { "name": "ApplyConflict", "description": "The apply touches fields another field manager owns (409). Set force, or change fieldManager." },
        { "name": "KubernetesError", "description": "The apiserver refused the object (its HTTP status: 400, 403, 422, ...). message is the apiserver's message." }
      ]
    }
  }
}