Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

command crd #27

Merged
merged 10 commits into from
Sep 19, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions pkg/command/crds/crd-status-subresource.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: operatorcommands.kubescape.io
spec:
group: kubescape.io
names:
plural: operatorcommands
singular: operatorcommand
kind: OperatorCommand
shortNames:
- opcmd
scope: Cluster
versions:
- name: v1alpha1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
args:
type: object
additionalProperties: true
commandType:
type: string
designators:
type: array
items:
type: object
additionalProperties: true
guid:
type: string
status:
type: object
properties:
completed:
type: boolean
completedAt:
type: string
format: date-time
error:
type: object
properties:
errorCode:
type: integer
message:
type: string
reason:
type: string
started:
type: boolean
startedAt:
type: string
format: date-time
subresources:
status: {}
conversion:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove

strategy: None
55 changes: 55 additions & 0 deletions pkg/command/crds/crd.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
apiVersion: apiextensions.k8s.io/v1
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

apiVersion: kubescape.io/v1alpha1
kind: OperatorCommand
metadata:
  name: example-operator-command
spec:
  guid: "123e4567-e89b-12d3-a456-426614174000"
  commandType: "Scan"
  designators: "cluster"
  args:
    namespace: "default"
    scanProfile: "strict"
status:
  started: true
  startedAt: "2024-09-10T12:34:56Z"
  completed: false
  error:
    reason: ""
    message: ""
    errorCode: 0

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

apiVersion: kubescape.io/v1alpha1
kind: OperatorCommand
metadata:
name: new-operatorcommand
spec:
guid: "123e4567-e89b-12d3-a456-426614174000"
commandType: "ExecutePolicy"
commandVersion: "1.0"
designators:
- key: "cluster"
value: "arn-aws-eks-eu-west-1-015253967648-cluster-ca-terraform-eks-dev-stage"
body: "eyJrZXkiOiJ2YWx1ZSJ9"
ttl: "1h"
args:
policyName: "SecurityPolicy"
policyLevel: "high"
commandIndex: 1
commandCount: 5
status:
started: true
startedAt: "2024-04-09T11:03:29Z"
completed: false
executer: "admin"
error:
reason: ""
message: ""
errorCode: 0

kind: CustomResourceDefinition
metadata:
name: operatorcommands.kubescape.io
spec:
group: kubescape.io
names:
kind: OperatorCommand
plural: operatorcommands
singular: operatorcommand
shortNames:
- opcmd
scope: Cluster
versions:
- name: v1alpha1
served: true
storage: true
schema:
# schema used for validation
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
guid:
type: string
commandType:
type: string
designators:
type: array
items:
args:
type: object
additionalProperties: true
status:
started:
type: boolean
startedAt:
allOf:
- $ref: '#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Time'
completed:
type: boolean
completedAt:
allOf:
- $ref: '#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Time'
error:
type: object
properties:
reason:
type: string
message:
type: string
errorCode:
type: integer
7 changes: 7 additions & 0 deletions pkg/command/types/api.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package types

const (
OperatorCommandGroup string = "kubescape.io"
OperatorCommandKind string = "OperatorCommand"
OperatorCommandPlural string = "operatorcommands"
)
10 changes: 10 additions & 0 deletions pkg/command/types/v1alpha1/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# OperatorCommand

The OperatorCommand CRD is designed to enable the execution of various actions within the cluster and reporting their status back to the backend. This CRD serves as a central mechanism for triggering and managing actions, replacing the functionality previously provided by the gateway and kollector.

How it Works

1. Creation: The backend creates a Command CRD instance, specifying the desired action and any necessary parameters for the action.
2. Synchronization: The Synchronizer, responsible for two-way communication, receives the Command CRD from the backend and saves it in the cluster.
3. Execution: The designated component in the cluster, identifies the new command via a watcher on the Kubernetes API, processes the Command CRD and performs the requested action within the cluster.
4. Status Reporting: Upon completion, the component updates the command CRD resource with the status of the action, providing information about success or failure, any relevant details, and potentially updating the Command CRD. The synchronizer, watching over the command CRD, will send it back to the backend for further processing.
16 changes: 16 additions & 0 deletions pkg/command/types/v1alpha1/api.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package v1alpha1

import (
"github.com/kubescape/backend/pkg/command/types"
"k8s.io/apimachinery/pkg/runtime/schema"
)

const (
OperatorCommandVersion string = "v1"
)

var SchemaGroupVersionResource = schema.GroupVersionResource{
Group: types.OperatorCommandGroup,
Version: OperatorCommandVersion,
Resource: types.OperatorCommandPlural,
}
51 changes: 51 additions & 0 deletions pkg/command/types/v1alpha1/types.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package v1alpha1

import (
"time"

"github.com/armosec/armoapi-go/identifiers"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

type OperatorCommandList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`

Items []OperatorCommand `json:"items"`
}

type OperatorCommand struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`

Spec OperatorCommandSpec `json:"spec,omitempty"`
Status OperatorCommandStatus `json:"status,omitempty"`
}

type OperatorCommandSpec struct {
GUID string `json:"guid"` // GUID is a unique identifier for the command
CommandType string `json:"commandType"` // CommandType is the type of the command
CommandVersion string `json:"commandVersion,omitempty"` // CommandVersion is the version of the command
Labels map[string]string `json:"labels,omitempty"` // Labels are the labels for the command
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove its part of the meta

Designators []identifiers.PortalDesignator `json:"designators,omitempty"` // Designators are the designators for the command
Body []byte `json:"body,omitempty"` // Body is the body of the command
TTL time.Duration `json:"ttl,omitempty"` // TTL is the time to live for the command
Args map[string]interface{} `json:"args,omitempty"` // Args are the arguments for the command
CommandIndex *int `json:"commandIndex,omitempty"` // CommandIndex is the index of the command in the sequence
CommandCount *int `json:"commandCount,omitempty"` // CommandCount is the total number of commands in the sequence
}

type OperatorCommandStatus struct {
Started bool `json:"started"` // Started indicates if the command has started
StartedAt *metav1.Time `json:"startedAt,omitempty"` // StartedAt is the time at which the command was started
Completed bool `json:"completed"` // Completed indicates if the command has completed
CompletedAt *metav1.Time `json:"completedAt,omitempty"` // CompletedAt is the time at which the command was completed
Executer string `json:"executer,omitempty"` // Executer is the entity that executed the command
Error *OperatorCommandStatusError `json:"error,omitempty"` // Error is the error that occurred during the execution of the command (if any)
}

type OperatorCommandStatusError struct {
Reason string `json:"reason,omitempty"` // reason for the error (optional)
Message string `json:"message,omitempty"` // error message (optional)
ErrorCode int `json:"errorCode,omitempty"` // error code (optional)
}
Loading