diff --git a/api/container.go b/api/container.go index 1c2aabc..54bac34 100644 --- a/api/container.go +++ b/api/container.go @@ -5,104 +5,6 @@ import ( "fmt" ) -func toContainerResult(container ContainerResult) (ContainerResult, error) { - // Environment Variables - var envVars []EnvironmentVariableResult - if container.EnvironmentVariables != nil { - envVars = make([]EnvironmentVariableResult, len(container.EnvironmentVariables)) - for j, ev := range container.EnvironmentVariables { - envVars[j] = EnvironmentVariableResult{ - Name: ev.Name, - Value: ev.Value, - Secret: ev.Secret, - } - } - } - - // Ingresses - var ingresses []ContainerResultIngressesIngress - if container.Ingresses != nil { - ingresses = make([]ContainerResultIngressesIngress, len(container.Ingresses)) - for j, v := range container.Ingresses { - ingresses[j] = ContainerResultIngressesIngress{ - DomainName: v.DomainName, - Port: v.Port, - EnableTLS: v.EnableTLS, - Allowlist: v.Allowlist, - State: v.State, - } - } - } - - // Mounts - var mounts []ContainerMounts - if container.Mounts != nil { - mounts = make([]ContainerMounts, len(container.Mounts)) - for j, m := range container.Mounts { - var volumeName string - if m.Volume.Name != "" { - volumeName = m.Volume.Name - } - mounts[j] = ContainerMounts{ - Path: m.Path, - Volume: ContainerMountsVolume{ - Name: volumeName, - }, - } - } - } - - // Health Check - var healthCheck *ContainerResultHealthCheck - if container.HealthCheck != nil { - healthCheck = &ContainerResultHealthCheck{ - Port: container.HealthCheck.Port, - Path: container.HealthCheck.Path, - } - } - - // Auto Scaling - var autoScaling *ContainerResultAutoScaling - if container.AutoScaling != nil { - var triggers []ContainerResultAutoScalingTriggersAutoScalingTrigger - if container.AutoScaling.Triggers != nil { - triggers = make([]ContainerResultAutoScalingTriggersAutoScalingTrigger, len(container.AutoScaling.Triggers)) - for j, t := range container.AutoScaling.Triggers { - triggers[j] = ContainerResultAutoScalingTriggersAutoScalingTrigger{ - Type: t.Type, - Threshold: t.Threshold, - } - } - } - autoScaling = &ContainerResultAutoScaling{ - Replicas: ContainerResultAutoScalingReplicas{ - Minimum: container.AutoScaling.Replicas.Minimum, - Maximum: container.AutoScaling.Replicas.Maximum, - }, - Triggers: triggers, - } - } - registry := container.PrivateRegistry - - return ContainerResult{ - Name: container.Name, - Image: container.Image, - PrivateRegistry: registry, - Resources: container.Resources, - EnvironmentVariables: envVars, - Ports: container.Ports, - Ingresses: ingresses, - Mounts: mounts, - HealthCheck: healthCheck, - NumberOfReplicas: container.NumberOfReplicas, - AutoScaling: autoScaling, - Locked: container.Locked, - State: container.State, - Command: container.Command, - Entrypoint: container.Entrypoint, - }, nil -} - func (client *Client) ListContainers(namespace string) ([]ContainerResult, error) { containerResponse, err := containerList(context.Background(), *client.client, namespace) if err != nil { @@ -110,11 +12,13 @@ func (client *Client) ListContainers(namespace string) ([]ContainerResult, error } namespaceResult := containerResponse.GetNamespace() - result := make([]ContainerResult, len(namespaceResult.Containers)) + if len(namespaceResult.Containers) == 0 { + return []ContainerResult{}, nil + } + result := make([]ContainerResult, 0, len(namespaceResult.Containers)) for _, container := range namespaceResult.Containers { - var c, _ = toContainerResult(container.ContainerResult) - result = append(result, c) + result = append(result, container.ContainerResult) } return result, nil @@ -130,9 +34,7 @@ func (client *Client) ListContainerByName(namespace string, containerName string return ContainerResult{}, fmt.Errorf("container %q not found in namespace %q", containerName, namespace) } - res, err := toContainerResult(container.Container) - - return res, err + return container.Container, err } func (client *Client) ContainerCreate(input ContainerCreateInput) (ContainerResult, error) { diff --git a/api/generated.go b/api/generated.go index c9150e1..480d798 100644 --- a/api/generated.go +++ b/api/generated.go @@ -55,13 +55,33 @@ var AllAutoScalingType = []AutoScalingType{ AutoScalingTypeCpu, } +// Enable this feature to get recommendations on how to improve your database usage. +// +// The tool will be providing you settings on a cluster level to tune your database, provide recommendations for +// missing indexes and more. +// +// Database clusters will be analyzed once a day. +type CloudDatabaseAdvisorInput struct { + // Set this field to `true` to enable recommendations on how to improve your database usage. + Enabled bool `json:"enabled"` +} + +// GetEnabled returns CloudDatabaseAdvisorInput.Enabled, and is useful for accessing the field via an interface. +func (v *CloudDatabaseAdvisorInput) GetEnabled() bool { return v.Enabled } + +// Input for create cloud database cluster. +// +// A database cluster is accessible from within the namespace your created it in. +// There is no limit on the number of users, or database. type CloudDatabaseClusterCreateInput struct { - Name string `json:"name"` - Namespace string `json:"namespace"` - Spec CloudDatabaseClusterSpecInput `json:"spec"` - Plan string `json:"plan"` - Databases []DatabaseInput `json:"databases"` - Users []DatabaseUserInput `json:"users"` + Name string `json:"name"` + Namespace string `json:"namespace"` + Spec CloudDatabaseClusterSpecInput `json:"spec"` + Plan string `json:"plan"` + Databases []DatabaseInput `json:"databases"` + Users []DatabaseUserInput `json:"users"` + Advisor *CloudDatabaseAdvisorInput `json:"advisor"` + ExternalConnection *ExternalConnectionInput `json:"externalConnection"` } // GetName returns CloudDatabaseClusterCreateInput.Name, and is useful for accessing the field via an interface. @@ -82,6 +102,14 @@ func (v *CloudDatabaseClusterCreateInput) GetDatabases() []DatabaseInput { retur // GetUsers returns CloudDatabaseClusterCreateInput.Users, and is useful for accessing the field via an interface. func (v *CloudDatabaseClusterCreateInput) GetUsers() []DatabaseUserInput { return v.Users } +// GetAdvisor returns CloudDatabaseClusterCreateInput.Advisor, and is useful for accessing the field via an interface. +func (v *CloudDatabaseClusterCreateInput) GetAdvisor() *CloudDatabaseAdvisorInput { return v.Advisor } + +// GetExternalConnection returns CloudDatabaseClusterCreateInput.ExternalConnection, and is useful for accessing the field via an interface. +func (v *CloudDatabaseClusterCreateInput) GetExternalConnection() *ExternalConnectionInput { + return v.ExternalConnection +} + type CloudDatabaseClusterDatabaseCreateInput struct { Cluster CloudDatabaseClusterResourceInput `json:"cluster"` Database DatabaseInput `json:"database"` @@ -124,11 +152,17 @@ func (v *CloudDatabaseClusterDatabaseResult) GetDescription() *string { return v // GetStatus returns CloudDatabaseClusterDatabaseResult.Status, and is useful for accessing the field via an interface. func (v *CloudDatabaseClusterDatabaseResult) GetStatus() string { return v.Status } +// Input for create cloud database cluster. +// +// A database cluster is accessible from within the namespace your created it in. +// There is no limit on the number of users, or database. type CloudDatabaseClusterModifyInput struct { - Name string `json:"name"` - Namespace string `json:"namespace"` - Databases []DatabaseInput `json:"databases"` - Users []DatabaseUserInput `json:"users"` + Name string `json:"name"` + Namespace string `json:"namespace"` + Databases []DatabaseInput `json:"databases"` + Users []DatabaseUserInput `json:"users"` + Advisor *CloudDatabaseAdvisorInput `json:"advisor"` + ExternalConnection *ExternalConnectionInput `json:"externalConnection"` } // GetName returns CloudDatabaseClusterModifyInput.Name, and is useful for accessing the field via an interface. @@ -143,6 +177,14 @@ func (v *CloudDatabaseClusterModifyInput) GetDatabases() []DatabaseInput { retur // GetUsers returns CloudDatabaseClusterModifyInput.Users, and is useful for accessing the field via an interface. func (v *CloudDatabaseClusterModifyInput) GetUsers() []DatabaseUserInput { return v.Users } +// GetAdvisor returns CloudDatabaseClusterModifyInput.Advisor, and is useful for accessing the field via an interface. +func (v *CloudDatabaseClusterModifyInput) GetAdvisor() *CloudDatabaseAdvisorInput { return v.Advisor } + +// GetExternalConnection returns CloudDatabaseClusterModifyInput.ExternalConnection, and is useful for accessing the field via an interface. +func (v *CloudDatabaseClusterModifyInput) GetExternalConnection() *ExternalConnectionInput { + return v.ExternalConnection +} + // CloudDatabaseClusterPlan includes the GraphQL fields of Plan requested by the fragment CloudDatabaseClusterPlan. type CloudDatabaseClusterPlan struct { Cpu int `json:"cpu"` @@ -200,17 +242,18 @@ func (v *CloudDatabaseClusterResourceInput) GetNamespace() string { return v.Nam // CloudDatabaseClusterResult includes the GraphQL fields of CloudDatabaseCluster requested by the fragment CloudDatabaseClusterResult. type CloudDatabaseClusterResult struct { - Id string `json:"id"` - Databases []CloudDatabaseClusterResultDatabasesDatabase `json:"databases"` - Name string `json:"name"` - Hostname string `json:"hostname"` - Namespace CloudDatabaseClusterResultNamespace `json:"namespace"` - Plan CloudDatabaseClusterResultPlan `json:"plan"` - Spec CloudDatabaseClusterResultSpec `json:"spec"` - Users []CloudDatabaseClusterResultUsersDatabaseUser `json:"users"` - AdminUser *CloudDatabaseClusterResultAdminUserDatabaseUser `json:"adminUser"` - State string `json:"state"` - Locked bool `json:"locked"` + Id string `json:"id"` + Databases []CloudDatabaseClusterResultDatabasesDatabase `json:"databases"` + Name string `json:"name"` + Hostname string `json:"hostname"` + Namespace CloudDatabaseClusterResultNamespace `json:"namespace"` + Plan CloudDatabaseClusterResultPlan `json:"plan"` + Spec CloudDatabaseClusterResultSpec `json:"spec"` + Users []CloudDatabaseClusterResultUsersDatabaseUser `json:"users"` + AdminUser *CloudDatabaseClusterResultAdminUserDatabaseUser `json:"adminUser"` + ExternalConnection *CloudDatabaseClusterResultExternalConnection `json:"externalConnection"` + State string `json:"state"` + Locked bool `json:"locked"` } // GetId returns CloudDatabaseClusterResult.Id, and is useful for accessing the field via an interface. @@ -248,6 +291,11 @@ func (v *CloudDatabaseClusterResult) GetAdminUser() *CloudDatabaseClusterResultA return v.AdminUser } +// GetExternalConnection returns CloudDatabaseClusterResult.ExternalConnection, and is useful for accessing the field via an interface. +func (v *CloudDatabaseClusterResult) GetExternalConnection() *CloudDatabaseClusterResultExternalConnection { + return v.ExternalConnection +} + // GetState returns CloudDatabaseClusterResult.State, and is useful for accessing the field via an interface. func (v *CloudDatabaseClusterResult) GetState() string { return v.State } @@ -418,6 +466,76 @@ func (v *CloudDatabaseClusterResultDatabasesDatabase) __premarshalJSON() (*__pre return &retval, nil } +// CloudDatabaseClusterResultExternalConnection includes the requested fields of the GraphQL type ExternalConnection. +type CloudDatabaseClusterResultExternalConnection struct { + ExternalConnectionResult `json:"-"` +} + +// GetIpv4 returns CloudDatabaseClusterResultExternalConnection.Ipv4, and is useful for accessing the field via an interface. +func (v *CloudDatabaseClusterResultExternalConnection) GetIpv4() string { + return v.ExternalConnectionResult.Ipv4 +} + +// GetIpv6 returns CloudDatabaseClusterResultExternalConnection.Ipv6, and is useful for accessing the field via an interface. +func (v *CloudDatabaseClusterResultExternalConnection) GetIpv6() string { + return v.ExternalConnectionResult.Ipv6 +} + +// GetPorts returns CloudDatabaseClusterResultExternalConnection.Ports, and is useful for accessing the field via an interface. +func (v *CloudDatabaseClusterResultExternalConnection) GetPorts() []ExternalConnectionResultPortsExternalConnectionPort { + return v.ExternalConnectionResult.Ports +} + +func (v *CloudDatabaseClusterResultExternalConnection) UnmarshalJSON(b []byte) error { + + if string(b) == "null" { + return nil + } + + var firstPass struct { + *CloudDatabaseClusterResultExternalConnection + graphql.NoUnmarshalJSON + } + firstPass.CloudDatabaseClusterResultExternalConnection = v + + err := json.Unmarshal(b, &firstPass) + if err != nil { + return err + } + + err = json.Unmarshal( + b, &v.ExternalConnectionResult) + if err != nil { + return err + } + return nil +} + +type __premarshalCloudDatabaseClusterResultExternalConnection struct { + Ipv4 string `json:"ipv4"` + + Ipv6 string `json:"ipv6"` + + Ports []ExternalConnectionResultPortsExternalConnectionPort `json:"ports"` +} + +func (v *CloudDatabaseClusterResultExternalConnection) MarshalJSON() ([]byte, error) { + premarshaled, err := v.__premarshalJSON() + if err != nil { + return nil, err + } + return json.Marshal(premarshaled) +} + +func (v *CloudDatabaseClusterResultExternalConnection) __premarshalJSON() (*__premarshalCloudDatabaseClusterResultExternalConnection, error) { + var retval __premarshalCloudDatabaseClusterResultExternalConnection + + retval.Ipv4 = v.ExternalConnectionResult.Ipv4 + retval.Ipv6 = v.ExternalConnectionResult.Ipv6 + retval.Ports = v.ExternalConnectionResult.Ports + return &retval, nil +} + // CloudDatabaseClusterResultNamespace includes the requested fields of the GraphQL type Namespace. type CloudDatabaseClusterResultNamespace struct { Name string `json:"name"` @@ -728,7 +846,8 @@ type ContainerCreateInput struct { // Example: `echo "Hello $(NAME)"`. // // This field is defined in docker exec format. https://docs.docker.com/reference/dockerfile/#shell-and-exec-form - Command []string `json:"command"` + Command []string `json:"command"` + ExternalConnection *ExternalConnectionInput `json:"externalConnection"` } // GetName returns ContainerCreateInput.Name, and is useful for accessing the field via an interface. @@ -775,6 +894,11 @@ func (v *ContainerCreateInput) GetEntrypoint() []string { return v.Entrypoint } // GetCommand returns ContainerCreateInput.Command, and is useful for accessing the field via an interface. func (v *ContainerCreateInput) GetCommand() []string { return v.Command } +// GetExternalConnection returns ContainerCreateInput.ExternalConnection, and is useful for accessing the field via an interface. +func (v *ContainerCreateInput) GetExternalConnection() *ExternalConnectionInput { + return v.ExternalConnection +} + type ContainerJobCreateInput struct { Name string `json:"name"` Namespace string `json:"namespace"` @@ -1046,7 +1170,8 @@ type ContainerModifyInput struct { // Example: `echo "Hello $(NAME)"`. // // This field is defined in docker exec format. https://docs.docker.com/reference/dockerfile/#shell-and-exec-form - Command []string `json:"command"` + Command []string `json:"command"` + ExternalConnection *ExternalConnectionInput `json:"externalConnection"` } // GetName returns ContainerModifyInput.Name, and is useful for accessing the field via an interface. @@ -1090,6 +1215,11 @@ func (v *ContainerModifyInput) GetEntrypoint() []string { return v.Entrypoint } // GetCommand returns ContainerModifyInput.Command, and is useful for accessing the field via an interface. func (v *ContainerModifyInput) GetCommand() []string { return v.Command } +// GetExternalConnection returns ContainerModifyInput.ExternalConnection, and is useful for accessing the field via an interface. +func (v *ContainerModifyInput) GetExternalConnection() *ExternalConnectionInput { + return v.ExternalConnection +} + // ContainerMounts includes the GraphQL fields of Mount requested by the fragment ContainerMounts. type ContainerMounts struct { Path string `json:"path"` @@ -1362,23 +1492,24 @@ var AllContainerResources = []ContainerResources{ // ContainerResult includes the GraphQL fields of Container requested by the fragment ContainerResult. type ContainerResult struct { - Name string `json:"name"` - Image string `json:"image"` - PrivateRegistry *ContainerResultPrivateRegistry `json:"privateRegistry"` - Resources ContainerResources `json:"resources"` - Command []string `json:"command"` - Entrypoint []string `json:"entrypoint"` - EnvironmentVariables []EnvironmentVariableResult `json:"environmentVariables"` - Ports []string `json:"ports"` - Ingresses []ContainerResultIngressesIngress `json:"ingresses"` - Mounts []ContainerMounts `json:"mounts"` - HealthCheck *ContainerResultHealthCheck `json:"healthCheck"` - AvailableReplicas int `json:"availableReplicas"` - NumberOfReplicas int `json:"numberOfReplicas"` - AutoScaling *ContainerResultAutoScaling `json:"autoScaling"` - State string `json:"state"` - Locked bool `json:"locked"` - Type ContainerType `json:"type"` + Name string `json:"name"` + Image string `json:"image"` + PrivateRegistry *ContainerResultPrivateRegistry `json:"privateRegistry"` + Resources ContainerResources `json:"resources"` + Command []string `json:"command"` + Entrypoint []string `json:"entrypoint"` + EnvironmentVariables []EnvironmentVariableResult `json:"environmentVariables"` + ExternalConnection *ContainerResultExternalConnection `json:"externalConnection"` + Ports []string `json:"ports"` + Ingresses []ContainerResultIngressesIngress `json:"ingresses"` + Mounts []ContainerMounts `json:"mounts"` + HealthCheck *ContainerResultHealthCheck `json:"healthCheck"` + AvailableReplicas int `json:"availableReplicas"` + NumberOfReplicas int `json:"numberOfReplicas"` + AutoScaling *ContainerResultAutoScaling `json:"autoScaling"` + State string `json:"state"` + Locked bool `json:"locked"` + Type ContainerType `json:"type"` } // GetName returns ContainerResult.Name, and is useful for accessing the field via an interface. @@ -1406,6 +1537,11 @@ func (v *ContainerResult) GetEnvironmentVariables() []EnvironmentVariableResult return v.EnvironmentVariables } +// GetExternalConnection returns ContainerResult.ExternalConnection, and is useful for accessing the field via an interface. +func (v *ContainerResult) GetExternalConnection() *ContainerResultExternalConnection { + return v.ExternalConnection +} + // GetPorts returns ContainerResult.Ports, and is useful for accessing the field via an interface. func (v *ContainerResult) GetPorts() []string { return v.Ports } @@ -1476,6 +1612,72 @@ func (v *ContainerResultAutoScalingTriggersAutoScalingTrigger) GetType() string // GetThreshold returns ContainerResultAutoScalingTriggersAutoScalingTrigger.Threshold, and is useful for accessing the field via an interface. func (v *ContainerResultAutoScalingTriggersAutoScalingTrigger) GetThreshold() int { return v.Threshold } +// ContainerResultExternalConnection includes the requested fields of the GraphQL type ExternalConnection. +type ContainerResultExternalConnection struct { + ExternalConnectionResult `json:"-"` +} + +// GetIpv4 returns ContainerResultExternalConnection.Ipv4, and is useful for accessing the field via an interface. +func (v *ContainerResultExternalConnection) GetIpv4() string { return v.ExternalConnectionResult.Ipv4 } + +// GetIpv6 returns ContainerResultExternalConnection.Ipv6, and is useful for accessing the field via an interface. +func (v *ContainerResultExternalConnection) GetIpv6() string { return v.ExternalConnectionResult.Ipv6 } + +// GetPorts returns ContainerResultExternalConnection.Ports, and is useful for accessing the field via an interface. +func (v *ContainerResultExternalConnection) GetPorts() []ExternalConnectionResultPortsExternalConnectionPort { + return v.ExternalConnectionResult.Ports +} + +func (v *ContainerResultExternalConnection) UnmarshalJSON(b []byte) error { + + if string(b) == "null" { + return nil + } + + var firstPass struct { + *ContainerResultExternalConnection + graphql.NoUnmarshalJSON + } + firstPass.ContainerResultExternalConnection = v + + err := json.Unmarshal(b, &firstPass) + if err != nil { + return err + } + + err = json.Unmarshal( + b, &v.ExternalConnectionResult) + if err != nil { + return err + } + return nil +} + +type __premarshalContainerResultExternalConnection struct { + Ipv4 string `json:"ipv4"` + + Ipv6 string `json:"ipv6"` + + Ports []ExternalConnectionResultPortsExternalConnectionPort `json:"ports"` +} + +func (v *ContainerResultExternalConnection) MarshalJSON() ([]byte, error) { + premarshaled, err := v.__premarshalJSON() + if err != nil { + return nil, err + } + return json.Marshal(premarshaled) +} + +func (v *ContainerResultExternalConnection) __premarshalJSON() (*__premarshalContainerResultExternalConnection, error) { + var retval __premarshalContainerResultExternalConnection + + retval.Ipv4 = v.ExternalConnectionResult.Ipv4 + retval.Ipv6 = v.ExternalConnectionResult.Ipv6 + retval.Ports = v.ExternalConnectionResult.Ports + return &retval, nil +} + // ContainerResultHealthCheck includes the requested fields of the GraphQL type HealthCheck. type ContainerResultHealthCheck struct { Port int `json:"port"` @@ -1628,6 +1830,96 @@ func (v *EnvironmentVariableResult) GetValue() *string { return v.Value } // GetSecret returns EnvironmentVariableResult.Secret, and is useful for accessing the field via an interface. func (v *EnvironmentVariableResult) GetSecret() bool { return v.Secret } +type ExternalConnectionInput struct { + SharedIp bool `json:"sharedIp"` + State State `json:"state"` + Ports []ExternalConnectionPortInput `json:"ports"` +} + +// GetSharedIp returns ExternalConnectionInput.SharedIp, and is useful for accessing the field via an interface. +func (v *ExternalConnectionInput) GetSharedIp() bool { return v.SharedIp } + +// GetState returns ExternalConnectionInput.State, and is useful for accessing the field via an interface. +func (v *ExternalConnectionInput) GetState() State { return v.State } + +// GetPorts returns ExternalConnectionInput.Ports, and is useful for accessing the field via an interface. +func (v *ExternalConnectionInput) GetPorts() []ExternalConnectionPortInput { return v.Ports } + +type ExternalConnectionPortInput struct { + ExternalPort *int `json:"externalPort"` + // Internal port is only used for external connections of containers. + // For other resources, it's automatically selected + // + // See ports in `ContainerCreateInput` and `ContainerModifyInput` + InternalPort *int `json:"internalPort"` + // Protocol is only used for external connections of containers. + // For other resources, only TCP is allowed. + Protocol Protocol `json:"protocol"` + State State `json:"state"` + AllowList []AllowListInput `json:"allowList"` +} + +// GetExternalPort returns ExternalConnectionPortInput.ExternalPort, and is useful for accessing the field via an interface. +func (v *ExternalConnectionPortInput) GetExternalPort() *int { return v.ExternalPort } + +// GetInternalPort returns ExternalConnectionPortInput.InternalPort, and is useful for accessing the field via an interface. +func (v *ExternalConnectionPortInput) GetInternalPort() *int { return v.InternalPort } + +// GetProtocol returns ExternalConnectionPortInput.Protocol, and is useful for accessing the field via an interface. +func (v *ExternalConnectionPortInput) GetProtocol() Protocol { return v.Protocol } + +// GetState returns ExternalConnectionPortInput.State, and is useful for accessing the field via an interface. +func (v *ExternalConnectionPortInput) GetState() State { return v.State } + +// GetAllowList returns ExternalConnectionPortInput.AllowList, and is useful for accessing the field via an interface. +func (v *ExternalConnectionPortInput) GetAllowList() []AllowListInput { return v.AllowList } + +// ExternalConnectionResult includes the GraphQL fields of ExternalConnection requested by the fragment ExternalConnectionResult. +type ExternalConnectionResult struct { + Ipv4 string `json:"ipv4"` + Ipv6 string `json:"ipv6"` + Ports []ExternalConnectionResultPortsExternalConnectionPort `json:"ports"` +} + +// GetIpv4 returns ExternalConnectionResult.Ipv4, and is useful for accessing the field via an interface. +func (v *ExternalConnectionResult) GetIpv4() string { return v.Ipv4 } + +// GetIpv6 returns ExternalConnectionResult.Ipv6, and is useful for accessing the field via an interface. +func (v *ExternalConnectionResult) GetIpv6() string { return v.Ipv6 } + +// GetPorts returns ExternalConnectionResult.Ports, and is useful for accessing the field via an interface. +func (v *ExternalConnectionResult) GetPorts() []ExternalConnectionResultPortsExternalConnectionPort { + return v.Ports +} + +// ExternalConnectionResultPortsExternalConnectionPort includes the requested fields of the GraphQL type ExternalConnectionPort. +type ExternalConnectionResultPortsExternalConnectionPort struct { + AllowList []string `json:"allowList"` + ExternalPort int `json:"externalPort"` + InternalPort *int `json:"internalPort"` + Protocol Protocol `json:"protocol"` +} + +// GetAllowList returns ExternalConnectionResultPortsExternalConnectionPort.AllowList, and is useful for accessing the field via an interface. +func (v *ExternalConnectionResultPortsExternalConnectionPort) GetAllowList() []string { + return v.AllowList +} + +// GetExternalPort returns ExternalConnectionResultPortsExternalConnectionPort.ExternalPort, and is useful for accessing the field via an interface. +func (v *ExternalConnectionResultPortsExternalConnectionPort) GetExternalPort() int { + return v.ExternalPort +} + +// GetInternalPort returns ExternalConnectionResultPortsExternalConnectionPort.InternalPort, and is useful for accessing the field via an interface. +func (v *ExternalConnectionResultPortsExternalConnectionPort) GetInternalPort() *int { + return v.InternalPort +} + +// GetProtocol returns ExternalConnectionResultPortsExternalConnectionPort.Protocol, and is useful for accessing the field via an interface. +func (v *ExternalConnectionResultPortsExternalConnectionPort) GetProtocol() Protocol { + return v.Protocol +} + type HealthCheckInput struct { Port int `json:"port"` Path string `json:"path"` @@ -1670,11 +1962,12 @@ type ManualScalingInput struct { func (v *ManualScalingInput) GetReplicas() int { return v.Replicas } type MessageQueueCreateInput struct { - Name string `json:"name"` - Namespace string `json:"namespace"` - Plan string `json:"plan"` - Spec MessageQueueSpecInput `json:"spec"` - AllowList []AllowListInput `json:"allowList"` + Name string `json:"name"` + Namespace string `json:"namespace"` + Plan string `json:"plan"` + Spec MessageQueueSpecInput `json:"spec"` + AllowList []AllowListInput `json:"allowList"` + ExternalConnection *ExternalConnectionInput `json:"externalConnection"` } // GetName returns MessageQueueCreateInput.Name, and is useful for accessing the field via an interface. @@ -1692,6 +1985,40 @@ func (v *MessageQueueCreateInput) GetSpec() MessageQueueSpecInput { return v.Spe // GetAllowList returns MessageQueueCreateInput.AllowList, and is useful for accessing the field via an interface. func (v *MessageQueueCreateInput) GetAllowList() []AllowListInput { return v.AllowList } +// GetExternalConnection returns MessageQueueCreateInput.ExternalConnection, and is useful for accessing the field via an interface. +func (v *MessageQueueCreateInput) GetExternalConnection() *ExternalConnectionInput { + return v.ExternalConnection +} + +// MessageQueueIngressResult includes the GraphQL fields of MessageQueueIngress requested by the fragment MessageQueueIngressResult. +type MessageQueueIngressResult struct { + AllowList []string `json:"allowList"` +} + +// GetAllowList returns MessageQueueIngressResult.AllowList, and is useful for accessing the field via an interface. +func (v *MessageQueueIngressResult) GetAllowList() []string { return v.AllowList } + +type MessageQueueModifyInput struct { + Name string `json:"name"` + Namespace string `json:"namespace"` + AllowList []AllowListInput `json:"allowList"` + ExternalConnection *ExternalConnectionInput `json:"externalConnection"` +} + +// GetName returns MessageQueueModifyInput.Name, and is useful for accessing the field via an interface. +func (v *MessageQueueModifyInput) GetName() string { return v.Name } + +// GetNamespace returns MessageQueueModifyInput.Namespace, and is useful for accessing the field via an interface. +func (v *MessageQueueModifyInput) GetNamespace() string { return v.Namespace } + +// GetAllowList returns MessageQueueModifyInput.AllowList, and is useful for accessing the field via an interface. +func (v *MessageQueueModifyInput) GetAllowList() []AllowListInput { return v.AllowList } + +// GetExternalConnection returns MessageQueueModifyInput.ExternalConnection, and is useful for accessing the field via an interface. +func (v *MessageQueueModifyInput) GetExternalConnection() *ExternalConnectionInput { + return v.ExternalConnection +} + // MessageQueuePlanResult includes the GraphQL fields of MessageQueuePlan requested by the fragment MessageQueuePlanResult. type MessageQueuePlanResult struct { Cpu float64 `json:"cpu"` @@ -1751,59 +2078,381 @@ func (v *MessageQueueResourceInput) GetName() string { return v.Name } // GetNamespace returns MessageQueueResourceInput.Namespace, and is useful for accessing the field via an interface. func (v *MessageQueueResourceInput) GetNamespace() string { return v.Namespace } -// MessageQueueResult includes the GraphQL fields of MessageQueue requested by the fragment MessageQueueResult. -type MessageQueueResult struct { - Id string `json:"id"` - Locked bool `json:"locked"` - Name string `json:"name"` - State string `json:"state"` - Namespace MessageQueueResultNamespace `json:"namespace"` - AdminUser *MessageQueueResultAdminUserMessageQueueUser `json:"adminUser"` +// MessageQueueResult includes the GraphQL fields of MessageQueue requested by the fragment MessageQueueResult. +type MessageQueueResult struct { + Id string `json:"id"` + Locked bool `json:"locked"` + Name string `json:"name"` + State string `json:"state"` + Namespace MessageQueueResultNamespace `json:"namespace"` + AdminUser *MessageQueueResultAdminUserMessageQueueUser `json:"adminUser"` + Plan MessageQueueResultPlanMessageQueuePlan `json:"plan"` + Spec MessageQueueResultSpecMessageQueueSpec `json:"spec"` + Ingress MessageQueueResultIngressMessageQueueIngress `json:"ingress"` + ExternalConnection *MessageQueueResultExternalConnection `json:"externalConnection"` +} + +// GetId returns MessageQueueResult.Id, and is useful for accessing the field via an interface. +func (v *MessageQueueResult) GetId() string { return v.Id } + +// GetLocked returns MessageQueueResult.Locked, and is useful for accessing the field via an interface. +func (v *MessageQueueResult) GetLocked() bool { return v.Locked } + +// GetName returns MessageQueueResult.Name, and is useful for accessing the field via an interface. +func (v *MessageQueueResult) GetName() string { return v.Name } + +// GetState returns MessageQueueResult.State, and is useful for accessing the field via an interface. +func (v *MessageQueueResult) GetState() string { return v.State } + +// GetNamespace returns MessageQueueResult.Namespace, and is useful for accessing the field via an interface. +func (v *MessageQueueResult) GetNamespace() MessageQueueResultNamespace { return v.Namespace } + +// GetAdminUser returns MessageQueueResult.AdminUser, and is useful for accessing the field via an interface. +func (v *MessageQueueResult) GetAdminUser() *MessageQueueResultAdminUserMessageQueueUser { + return v.AdminUser +} + +// GetPlan returns MessageQueueResult.Plan, and is useful for accessing the field via an interface. +func (v *MessageQueueResult) GetPlan() MessageQueueResultPlanMessageQueuePlan { return v.Plan } + +// GetSpec returns MessageQueueResult.Spec, and is useful for accessing the field via an interface. +func (v *MessageQueueResult) GetSpec() MessageQueueResultSpecMessageQueueSpec { return v.Spec } + +// GetIngress returns MessageQueueResult.Ingress, and is useful for accessing the field via an interface. +func (v *MessageQueueResult) GetIngress() MessageQueueResultIngressMessageQueueIngress { + return v.Ingress +} + +// GetExternalConnection returns MessageQueueResult.ExternalConnection, and is useful for accessing the field via an interface. +func (v *MessageQueueResult) GetExternalConnection() *MessageQueueResultExternalConnection { + return v.ExternalConnection +} + +// MessageQueueResultAdminUserMessageQueueUser includes the requested fields of the GraphQL type MessageQueueUser. +type MessageQueueResultAdminUserMessageQueueUser struct { + Name string `json:"name"` + Role string `json:"role"` + Status string `json:"status"` +} + +// GetName returns MessageQueueResultAdminUserMessageQueueUser.Name, and is useful for accessing the field via an interface. +func (v *MessageQueueResultAdminUserMessageQueueUser) GetName() string { return v.Name } + +// GetRole returns MessageQueueResultAdminUserMessageQueueUser.Role, and is useful for accessing the field via an interface. +func (v *MessageQueueResultAdminUserMessageQueueUser) GetRole() string { return v.Role } + +// GetStatus returns MessageQueueResultAdminUserMessageQueueUser.Status, and is useful for accessing the field via an interface. +func (v *MessageQueueResultAdminUserMessageQueueUser) GetStatus() string { return v.Status } + +// MessageQueueResultExternalConnection includes the requested fields of the GraphQL type ExternalConnection. +type MessageQueueResultExternalConnection struct { + ExternalConnectionResult `json:"-"` +} + +// GetIpv4 returns MessageQueueResultExternalConnection.Ipv4, and is useful for accessing the field via an interface. +func (v *MessageQueueResultExternalConnection) GetIpv4() string { + return v.ExternalConnectionResult.Ipv4 +} + +// GetIpv6 returns MessageQueueResultExternalConnection.Ipv6, and is useful for accessing the field via an interface. +func (v *MessageQueueResultExternalConnection) GetIpv6() string { + return v.ExternalConnectionResult.Ipv6 +} + +// GetPorts returns MessageQueueResultExternalConnection.Ports, and is useful for accessing the field via an interface. +func (v *MessageQueueResultExternalConnection) GetPorts() []ExternalConnectionResultPortsExternalConnectionPort { + return v.ExternalConnectionResult.Ports +} + +func (v *MessageQueueResultExternalConnection) UnmarshalJSON(b []byte) error { + + if string(b) == "null" { + return nil + } + + var firstPass struct { + *MessageQueueResultExternalConnection + graphql.NoUnmarshalJSON + } + firstPass.MessageQueueResultExternalConnection = v + + err := json.Unmarshal(b, &firstPass) + if err != nil { + return err + } + + err = json.Unmarshal( + b, &v.ExternalConnectionResult) + if err != nil { + return err + } + return nil +} + +type __premarshalMessageQueueResultExternalConnection struct { + Ipv4 string `json:"ipv4"` + + Ipv6 string `json:"ipv6"` + + Ports []ExternalConnectionResultPortsExternalConnectionPort `json:"ports"` +} + +func (v *MessageQueueResultExternalConnection) MarshalJSON() ([]byte, error) { + premarshaled, err := v.__premarshalJSON() + if err != nil { + return nil, err + } + return json.Marshal(premarshaled) +} + +func (v *MessageQueueResultExternalConnection) __premarshalJSON() (*__premarshalMessageQueueResultExternalConnection, error) { + var retval __premarshalMessageQueueResultExternalConnection + + retval.Ipv4 = v.ExternalConnectionResult.Ipv4 + retval.Ipv6 = v.ExternalConnectionResult.Ipv6 + retval.Ports = v.ExternalConnectionResult.Ports + return &retval, nil +} + +// MessageQueueResultIngressMessageQueueIngress includes the requested fields of the GraphQL type MessageQueueIngress. +type MessageQueueResultIngressMessageQueueIngress struct { + MessageQueueIngressResult `json:"-"` +} + +// GetAllowList returns MessageQueueResultIngressMessageQueueIngress.AllowList, and is useful for accessing the field via an interface. +func (v *MessageQueueResultIngressMessageQueueIngress) GetAllowList() []string { + return v.MessageQueueIngressResult.AllowList +} + +func (v *MessageQueueResultIngressMessageQueueIngress) UnmarshalJSON(b []byte) error { + + if string(b) == "null" { + return nil + } + + var firstPass struct { + *MessageQueueResultIngressMessageQueueIngress + graphql.NoUnmarshalJSON + } + firstPass.MessageQueueResultIngressMessageQueueIngress = v + + err := json.Unmarshal(b, &firstPass) + if err != nil { + return err + } + + err = json.Unmarshal( + b, &v.MessageQueueIngressResult) + if err != nil { + return err + } + return nil +} + +type __premarshalMessageQueueResultIngressMessageQueueIngress struct { + AllowList []string `json:"allowList"` +} + +func (v *MessageQueueResultIngressMessageQueueIngress) MarshalJSON() ([]byte, error) { + premarshaled, err := v.__premarshalJSON() + if err != nil { + return nil, err + } + return json.Marshal(premarshaled) +} + +func (v *MessageQueueResultIngressMessageQueueIngress) __premarshalJSON() (*__premarshalMessageQueueResultIngressMessageQueueIngress, error) { + var retval __premarshalMessageQueueResultIngressMessageQueueIngress + + retval.AllowList = v.MessageQueueIngressResult.AllowList + return &retval, nil +} + +// MessageQueueResultNamespace includes the requested fields of the GraphQL type Namespace. +type MessageQueueResultNamespace struct { + Name string `json:"name"` +} + +// GetName returns MessageQueueResultNamespace.Name, and is useful for accessing the field via an interface. +func (v *MessageQueueResultNamespace) GetName() string { return v.Name } + +// MessageQueueResultPlanMessageQueuePlan includes the requested fields of the GraphQL type MessageQueuePlan. +type MessageQueueResultPlanMessageQueuePlan struct { + MessageQueuePlanResult `json:"-"` +} + +// GetCpu returns MessageQueueResultPlanMessageQueuePlan.Cpu, and is useful for accessing the field via an interface. +func (v *MessageQueueResultPlanMessageQueuePlan) GetCpu() float64 { + return v.MessageQueuePlanResult.Cpu +} + +// GetGroup returns MessageQueueResultPlanMessageQueuePlan.Group, and is useful for accessing the field via an interface. +func (v *MessageQueueResultPlanMessageQueuePlan) GetGroup() string { + return v.MessageQueuePlanResult.Group +} + +// GetId returns MessageQueueResultPlanMessageQueuePlan.Id, and is useful for accessing the field via an interface. +func (v *MessageQueueResultPlanMessageQueuePlan) GetId() string { return v.MessageQueuePlanResult.Id } + +// GetMemory returns MessageQueueResultPlanMessageQueuePlan.Memory, and is useful for accessing the field via an interface. +func (v *MessageQueueResultPlanMessageQueuePlan) GetMemory() float64 { + return v.MessageQueuePlanResult.Memory +} + +// GetName returns MessageQueueResultPlanMessageQueuePlan.Name, and is useful for accessing the field via an interface. +func (v *MessageQueueResultPlanMessageQueuePlan) GetName() string { + return v.MessageQueuePlanResult.Name +} + +// GetPrice returns MessageQueueResultPlanMessageQueuePlan.Price, and is useful for accessing the field via an interface. +func (v *MessageQueueResultPlanMessageQueuePlan) GetPrice() MessageQueuePlanResultPrice { + return v.MessageQueuePlanResult.Price +} + +// GetReplicas returns MessageQueueResultPlanMessageQueuePlan.Replicas, and is useful for accessing the field via an interface. +func (v *MessageQueueResultPlanMessageQueuePlan) GetReplicas() int { + return v.MessageQueuePlanResult.Replicas +} + +// GetStorage returns MessageQueueResultPlanMessageQueuePlan.Storage, and is useful for accessing the field via an interface. +func (v *MessageQueueResultPlanMessageQueuePlan) GetStorage() float64 { + return v.MessageQueuePlanResult.Storage +} + +func (v *MessageQueueResultPlanMessageQueuePlan) UnmarshalJSON(b []byte) error { + + if string(b) == "null" { + return nil + } + + var firstPass struct { + *MessageQueueResultPlanMessageQueuePlan + graphql.NoUnmarshalJSON + } + firstPass.MessageQueueResultPlanMessageQueuePlan = v + + err := json.Unmarshal(b, &firstPass) + if err != nil { + return err + } + + err = json.Unmarshal( + b, &v.MessageQueuePlanResult) + if err != nil { + return err + } + return nil +} + +type __premarshalMessageQueueResultPlanMessageQueuePlan struct { + Cpu float64 `json:"cpu"` + + Group string `json:"group"` + + Id string `json:"id"` + + Memory float64 `json:"memory"` + + Name string `json:"name"` + + Price MessageQueuePlanResultPrice `json:"price"` + + Replicas int `json:"replicas"` + + Storage float64 `json:"storage"` +} + +func (v *MessageQueueResultPlanMessageQueuePlan) MarshalJSON() ([]byte, error) { + premarshaled, err := v.__premarshalJSON() + if err != nil { + return nil, err + } + return json.Marshal(premarshaled) +} + +func (v *MessageQueueResultPlanMessageQueuePlan) __premarshalJSON() (*__premarshalMessageQueueResultPlanMessageQueuePlan, error) { + var retval __premarshalMessageQueueResultPlanMessageQueuePlan + + retval.Cpu = v.MessageQueuePlanResult.Cpu + retval.Group = v.MessageQueuePlanResult.Group + retval.Id = v.MessageQueuePlanResult.Id + retval.Memory = v.MessageQueuePlanResult.Memory + retval.Name = v.MessageQueuePlanResult.Name + retval.Price = v.MessageQueuePlanResult.Price + retval.Replicas = v.MessageQueuePlanResult.Replicas + retval.Storage = v.MessageQueuePlanResult.Storage + return &retval, nil +} + +// MessageQueueResultSpecMessageQueueSpec includes the requested fields of the GraphQL type MessageQueueSpec. +type MessageQueueResultSpecMessageQueueSpec struct { + MessageQueueVersionResult `json:"-"` +} + +// GetPatchLevelVersion returns MessageQueueResultSpecMessageQueueSpec.PatchLevelVersion, and is useful for accessing the field via an interface. +func (v *MessageQueueResultSpecMessageQueueSpec) GetPatchLevelVersion() string { + return v.MessageQueueVersionResult.PatchLevelVersion } -// GetId returns MessageQueueResult.Id, and is useful for accessing the field via an interface. -func (v *MessageQueueResult) GetId() string { return v.Id } +// GetType returns MessageQueueResultSpecMessageQueueSpec.Type, and is useful for accessing the field via an interface. +func (v *MessageQueueResultSpecMessageQueueSpec) GetType() string { + return v.MessageQueueVersionResult.Type +} -// GetLocked returns MessageQueueResult.Locked, and is useful for accessing the field via an interface. -func (v *MessageQueueResult) GetLocked() bool { return v.Locked } +// GetVersion returns MessageQueueResultSpecMessageQueueSpec.Version, and is useful for accessing the field via an interface. +func (v *MessageQueueResultSpecMessageQueueSpec) GetVersion() string { + return v.MessageQueueVersionResult.Version +} -// GetName returns MessageQueueResult.Name, and is useful for accessing the field via an interface. -func (v *MessageQueueResult) GetName() string { return v.Name } +func (v *MessageQueueResultSpecMessageQueueSpec) UnmarshalJSON(b []byte) error { -// GetState returns MessageQueueResult.State, and is useful for accessing the field via an interface. -func (v *MessageQueueResult) GetState() string { return v.State } + if string(b) == "null" { + return nil + } -// GetNamespace returns MessageQueueResult.Namespace, and is useful for accessing the field via an interface. -func (v *MessageQueueResult) GetNamespace() MessageQueueResultNamespace { return v.Namespace } + var firstPass struct { + *MessageQueueResultSpecMessageQueueSpec + graphql.NoUnmarshalJSON + } + firstPass.MessageQueueResultSpecMessageQueueSpec = v -// GetAdminUser returns MessageQueueResult.AdminUser, and is useful for accessing the field via an interface. -func (v *MessageQueueResult) GetAdminUser() *MessageQueueResultAdminUserMessageQueueUser { - return v.AdminUser -} + err := json.Unmarshal(b, &firstPass) + if err != nil { + return err + } -// MessageQueueResultAdminUserMessageQueueUser includes the requested fields of the GraphQL type MessageQueueUser. -type MessageQueueResultAdminUserMessageQueueUser struct { - Name string `json:"name"` - Role string `json:"role"` - Status string `json:"status"` + err = json.Unmarshal( + b, &v.MessageQueueVersionResult) + if err != nil { + return err + } + return nil } -// GetName returns MessageQueueResultAdminUserMessageQueueUser.Name, and is useful for accessing the field via an interface. -func (v *MessageQueueResultAdminUserMessageQueueUser) GetName() string { return v.Name } +type __premarshalMessageQueueResultSpecMessageQueueSpec struct { + PatchLevelVersion string `json:"patchLevelVersion"` -// GetRole returns MessageQueueResultAdminUserMessageQueueUser.Role, and is useful for accessing the field via an interface. -func (v *MessageQueueResultAdminUserMessageQueueUser) GetRole() string { return v.Role } + Type string `json:"type"` -// GetStatus returns MessageQueueResultAdminUserMessageQueueUser.Status, and is useful for accessing the field via an interface. -func (v *MessageQueueResultAdminUserMessageQueueUser) GetStatus() string { return v.Status } + Version string `json:"version"` +} -// MessageQueueResultNamespace includes the requested fields of the GraphQL type Namespace. -type MessageQueueResultNamespace struct { - Name string `json:"name"` +func (v *MessageQueueResultSpecMessageQueueSpec) MarshalJSON() ([]byte, error) { + premarshaled, err := v.__premarshalJSON() + if err != nil { + return nil, err + } + return json.Marshal(premarshaled) } -// GetName returns MessageQueueResultNamespace.Name, and is useful for accessing the field via an interface. -func (v *MessageQueueResultNamespace) GetName() string { return v.Name } +func (v *MessageQueueResultSpecMessageQueueSpec) __premarshalJSON() (*__premarshalMessageQueueResultSpecMessageQueueSpec, error) { + var retval __premarshalMessageQueueResultSpecMessageQueueSpec + + retval.PatchLevelVersion = v.MessageQueueVersionResult.PatchLevelVersion + retval.Type = v.MessageQueueVersionResult.Type + retval.Version = v.MessageQueueVersionResult.Version + return &retval, nil +} type MessageQueueSpecInput struct { Type string `json:"type"` @@ -1976,6 +2625,18 @@ type NamespaceResultVolumesVolume struct { // GetName returns NamespaceResultVolumesVolume.Name, and is useful for accessing the field via an interface. func (v *NamespaceResultVolumesVolume) GetName() string { return v.Name } +type Protocol string + +const ( + ProtocolTcp Protocol = "TCP" + ProtocolUdp Protocol = "UDP" +) + +var AllProtocol = []Protocol{ + ProtocolTcp, + ProtocolUdp, +} + type RegistryCreateInput struct { Namespace string `json:"namespace"` Name string `json:"name"` @@ -2401,6 +3062,16 @@ func (v *__messageQueueGetInput) GetMessageQueueInput() MessageQueueResourceInpu return v.MessageQueueInput } +// __messageQueueModifyInput is used internally by genqlient +type __messageQueueModifyInput struct { + MessageQueueInput MessageQueueModifyInput `json:"messageQueueInput"` +} + +// GetMessageQueueInput returns __messageQueueModifyInput.MessageQueueInput, and is useful for accessing the field via an interface. +func (v *__messageQueueModifyInput) GetMessageQueueInput() MessageQueueModifyInput { + return v.MessageQueueInput +} + // __messageQueueUserCredentialsGetInput is used internally by genqlient type __messageQueueUserCredentialsGetInput struct { MessageQueueInput MessageQueueResourceInput `json:"messageQueueInput"` @@ -2942,6 +3613,11 @@ func (v *containerListNamespaceContainersContainer) GetEnvironmentVariables() [] return v.ContainerResult.EnvironmentVariables } +// GetExternalConnection returns containerListNamespaceContainersContainer.ExternalConnection, and is useful for accessing the field via an interface. +func (v *containerListNamespaceContainersContainer) GetExternalConnection() *ContainerResultExternalConnection { + return v.ContainerResult.ExternalConnection +} + // GetPorts returns containerListNamespaceContainersContainer.Ports, and is useful for accessing the field via an interface. func (v *containerListNamespaceContainersContainer) GetPorts() []string { return v.ContainerResult.Ports @@ -3028,6 +3704,8 @@ type __premarshalcontainerListNamespaceContainersContainer struct { EnvironmentVariables []EnvironmentVariableResult `json:"environmentVariables"` + ExternalConnection *ContainerResultExternalConnection `json:"externalConnection"` + Ports []string `json:"ports"` Ingresses []ContainerResultIngressesIngress `json:"ingresses"` @@ -3067,6 +3745,7 @@ func (v *containerListNamespaceContainersContainer) __premarshalJSON() (*__prema retval.Command = v.ContainerResult.Command retval.Entrypoint = v.ContainerResult.Entrypoint retval.EnvironmentVariables = v.ContainerResult.EnvironmentVariables + retval.ExternalConnection = v.ContainerResult.ExternalConnection retval.Ports = v.ContainerResult.Ports retval.Ingresses = v.ContainerResult.Ingresses retval.Mounts = v.ContainerResult.Mounts @@ -3514,6 +4193,17 @@ type messageQueueGetResponse struct { // GetMessageQueue returns messageQueueGetResponse.MessageQueue, and is useful for accessing the field via an interface. func (v *messageQueueGetResponse) GetMessageQueue() MessageQueueResult { return v.MessageQueue } +// messageQueueModifyResponse is returned by messageQueueModify on success. +type messageQueueModifyResponse struct { + // Cost: complexity = 100, multipliers = [], defaultMultiplier = null + MessageQueueModify MessageQueueResult `json:"messageQueueModify"` +} + +// GetMessageQueueModify returns messageQueueModifyResponse.MessageQueueModify, and is useful for accessing the field via an interface. +func (v *messageQueueModifyResponse) GetMessageQueueModify() MessageQueueResult { + return v.MessageQueueModify +} + // messageQueuePlansGetResponse is returned by messageQueuePlansGet on success. type messageQueuePlansGetResponse struct { // Cost: complexity = 100, multipliers = [], defaultMultiplier = null @@ -4195,6 +4885,9 @@ fragment CloudDatabaseClusterResult on CloudDatabaseCluster { adminUser { ... CloudDatabaseClusterUserResult } + externalConnection { + ... ExternalConnectionResult + } state locked } @@ -4214,6 +4907,16 @@ fragment CloudDatabaseClusterUserResult on DatabaseUser { password role } +fragment ExternalConnectionResult on ExternalConnection { + ipv4 + ipv6 + ports { + allowList + externalPort + internalPort + protocol + } +} ` func cloudDatabaseClusterCreate( @@ -4383,6 +5086,9 @@ fragment CloudDatabaseClusterResult on CloudDatabaseCluster { adminUser { ... CloudDatabaseClusterUserResult } + externalConnection { + ... ExternalConnectionResult + } state locked } @@ -4402,6 +5108,16 @@ fragment CloudDatabaseClusterUserResult on DatabaseUser { password role } +fragment ExternalConnectionResult on ExternalConnection { + ipv4 + ipv6 + ports { + allowList + externalPort + internalPort + protocol + } +} ` func cloudDatabaseClusterModify( @@ -4524,6 +5240,9 @@ fragment ContainerResult on Container { environmentVariables { ... EnvironmentVariableResult } + externalConnection { + ... ExternalConnectionResult + } ports ingresses { domainName @@ -4560,6 +5279,16 @@ fragment EnvironmentVariableResult on EnvironmentVariable { value secret } +fragment ExternalConnectionResult on ExternalConnection { + ipv4 + ipv6 + ports { + allowList + externalPort + internalPort + protocol + } +} fragment ContainerMounts on Mount { path volume { @@ -4615,6 +5344,9 @@ fragment ContainerResult on Container { environmentVariables { ... EnvironmentVariableResult } + externalConnection { + ... ExternalConnectionResult + } ports ingresses { domainName @@ -4651,6 +5383,16 @@ fragment EnvironmentVariableResult on EnvironmentVariable { value secret } +fragment ExternalConnectionResult on ExternalConnection { + ipv4 + ipv6 + ports { + allowList + externalPort + internalPort + protocol + } +} fragment ContainerMounts on Mount { path volume { @@ -5054,6 +5796,9 @@ fragment ContainerResult on Container { environmentVariables { ... EnvironmentVariableResult } + externalConnection { + ... ExternalConnectionResult + } ports ingresses { domainName @@ -5090,6 +5835,16 @@ fragment EnvironmentVariableResult on EnvironmentVariable { value secret } +fragment ExternalConnectionResult on ExternalConnection { + ipv4 + ipv6 + ports { + allowList + externalPort + internalPort + protocol + } +} fragment ContainerMounts on Mount { path volume { @@ -5143,6 +5898,9 @@ fragment ContainerResult on Container { environmentVariables { ... EnvironmentVariableResult } + externalConnection { + ... ExternalConnectionResult + } ports ingresses { domainName @@ -5179,6 +5937,16 @@ fragment EnvironmentVariableResult on EnvironmentVariable { value secret } +fragment ExternalConnectionResult on ExternalConnection { + ipv4 + ipv6 + ports { + allowList + externalPort + internalPort + protocol + } +} fragment ContainerMounts on Mount { path volume { @@ -5400,6 +6168,9 @@ fragment CloudDatabaseClusterResult on CloudDatabaseCluster { adminUser { ... CloudDatabaseClusterUserResult } + externalConnection { + ... ExternalConnectionResult + } state locked } @@ -5419,6 +6190,16 @@ fragment CloudDatabaseClusterUserResult on DatabaseUser { password role } +fragment ExternalConnectionResult on ExternalConnection { + ipv4 + ipv6 + ports { + allowList + externalPort + internalPort + protocol + } +} ` func getCloudDatabaseCluster( @@ -5609,6 +6390,9 @@ fragment CloudDatabaseClusterResult on CloudDatabaseCluster { adminUser { ... CloudDatabaseClusterUserResult } + externalConnection { + ... ExternalConnectionResult + } state locked } @@ -5628,6 +6412,16 @@ fragment CloudDatabaseClusterUserResult on DatabaseUser { password role } +fragment ExternalConnectionResult on ExternalConnection { + ipv4 + ipv6 + ports { + allowList + externalPort + internalPort + protocol + } +} ` func getCloudDatabaseClusters( @@ -5671,6 +6465,49 @@ fragment MessageQueueResult on MessageQueue { role status } + plan { + ... MessageQueuePlanResult + } + spec { + ... MessageQueueVersionResult + } + ingress { + ... MessageQueueIngressResult + } + externalConnection { + ... ExternalConnectionResult + } +} +fragment MessageQueuePlanResult on MessageQueuePlan { + cpu(unit: CPU) + group + id + memory(unit: GB) + name + price { + amount + currency + } + replicas + storage(unit: GB) +} +fragment MessageQueueVersionResult on MessageQueueSpec { + patchLevelVersion + type + version +} +fragment MessageQueueIngressResult on MessageQueueIngress { + allowList +} +fragment ExternalConnectionResult on ExternalConnection { + ipv4 + ipv6 + ports { + allowList + externalPort + internalPort + protocol + } } ` @@ -5751,6 +6588,49 @@ fragment MessageQueueResult on MessageQueue { role status } + plan { + ... MessageQueuePlanResult + } + spec { + ... MessageQueueVersionResult + } + ingress { + ... MessageQueueIngressResult + } + externalConnection { + ... ExternalConnectionResult + } +} +fragment MessageQueuePlanResult on MessageQueuePlan { + cpu(unit: CPU) + group + id + memory(unit: GB) + name + price { + amount + currency + } + replicas + storage(unit: GB) +} +fragment MessageQueueVersionResult on MessageQueueSpec { + patchLevelVersion + type + version +} +fragment MessageQueueIngressResult on MessageQueueIngress { + allowList +} +fragment ExternalConnectionResult on ExternalConnection { + ipv4 + ipv6 + ports { + allowList + externalPort + internalPort + protocol + } } ` @@ -5779,6 +6659,97 @@ func messageQueueGet( return data_, err_ } +// The mutation executed by messageQueueModify. +const messageQueueModify_Operation = ` +mutation messageQueueModify ($messageQueueInput: MessageQueueModifyInput!) { + messageQueueModify(messageQueue: $messageQueueInput) { + ... MessageQueueResult + } +} +fragment MessageQueueResult on MessageQueue { + id + locked + name + state + namespace { + name + } + adminUser { + name + role + status + } + plan { + ... MessageQueuePlanResult + } + spec { + ... MessageQueueVersionResult + } + ingress { + ... MessageQueueIngressResult + } + externalConnection { + ... ExternalConnectionResult + } +} +fragment MessageQueuePlanResult on MessageQueuePlan { + cpu(unit: CPU) + group + id + memory(unit: GB) + name + price { + amount + currency + } + replicas + storage(unit: GB) +} +fragment MessageQueueVersionResult on MessageQueueSpec { + patchLevelVersion + type + version +} +fragment MessageQueueIngressResult on MessageQueueIngress { + allowList +} +fragment ExternalConnectionResult on ExternalConnection { + ipv4 + ipv6 + ports { + allowList + externalPort + internalPort + protocol + } +} +` + +func messageQueueModify( + ctx_ context.Context, + client_ graphql.Client, + messageQueueInput MessageQueueModifyInput, +) (data_ *messageQueueModifyResponse, err_ error) { + req_ := &graphql.Request{ + OpName: "messageQueueModify", + Query: messageQueueModify_Operation, + Variables: &__messageQueueModifyInput{ + MessageQueueInput: messageQueueInput, + }, + } + + data_ = &messageQueueModifyResponse{} + resp_ := &graphql.Response{Data: data_} + + err_ = client_.MakeRequest( + ctx_, + req_, + resp_, + ) + + return data_, err_ +} + // The query executed by messageQueuePlansGet. const messageQueuePlansGet_Operation = ` query messageQueuePlansGet { @@ -5920,6 +6891,49 @@ fragment MessageQueueResult on MessageQueue { role status } + plan { + ... MessageQueuePlanResult + } + spec { + ... MessageQueueVersionResult + } + ingress { + ... MessageQueueIngressResult + } + externalConnection { + ... ExternalConnectionResult + } +} +fragment MessageQueuePlanResult on MessageQueuePlan { + cpu(unit: CPU) + group + id + memory(unit: GB) + name + price { + amount + currency + } + replicas + storage(unit: GB) +} +fragment MessageQueueVersionResult on MessageQueueSpec { + patchLevelVersion + type + version +} +fragment MessageQueueIngressResult on MessageQueueIngress { + allowList +} +fragment ExternalConnectionResult on ExternalConnection { + ipv4 + ipv6 + ports { + allowList + externalPort + internalPort + protocol + } } ` diff --git a/api/messageQueue.go b/api/messageQueue.go index 66b6c09..25e45f7 100644 --- a/api/messageQueue.go +++ b/api/messageQueue.go @@ -31,6 +31,14 @@ func (client *Client) MessageQueueCreate(input MessageQueueCreateInput) (Message return resp.GetMessageQueueCreate(), nil } +func (client *Client) MessageQueueModify(input MessageQueueModifyInput) (MessageQueueResult, error) { + resp, err := messageQueueModify(context.Background(), *client.client, input) + if err != nil { + return MessageQueueResult{}, err + } + return resp.GetMessageQueueModify(), nil +} + func (client *Client) MessageQueueDelete(input MessageQueueResourceInput) (bool, error) { resp, err := messageQueueDelete(context.Background(), *client.client, input) if err != nil { diff --git a/cmd/cloudDatabaseCluster.go b/cmd/cloudDatabaseCluster.go index 8d03cd9..2e4cce5 100644 --- a/cmd/cloudDatabaseCluster.go +++ b/cmd/cloudDatabaseCluster.go @@ -227,7 +227,7 @@ func init() { cloudDatabaseClusterCmd.AddCommand(listCloudDatabaseClustersCmd) - deleteCloudDatabaseClusterCmd.Flags().String("namespace", "", "Namespace") + deleteCloudDatabaseClusterCmd.Flags().StringP("namespace", "n", "", "Namespace") deleteCloudDatabaseClusterCmd.Flags().String("name", "", "Name of the cluster") deleteCloudDatabaseClusterCmd.MarkFlagRequired("namespace") deleteCloudDatabaseClusterCmd.MarkFlagRequired("name") @@ -249,4 +249,7 @@ func init() { getClusterDatabaseUserCredentialsCmd.MarkFlagRequired("namespace") getClusterDatabaseUserCredentialsCmd.MarkFlagRequired("user") cloudDatabaseClusterCmd.AddCommand(getClusterDatabaseUserCredentialsCmd) + + //External Connection + cloudDatabaseClusterCmd.AddCommand(cloudDatabaseClusterEnableExternalConnectionCmd) } diff --git a/cmd/cloudDatabaseClusterDatabase.go b/cmd/cloudDatabaseClusterDatabase.go index 674f089..d916f32 100644 --- a/cmd/cloudDatabaseClusterDatabase.go +++ b/cmd/cloudDatabaseClusterDatabase.go @@ -105,13 +105,13 @@ var deleteCloudDatabaseClusterDatabaseCmd = &cobra.Command{ func init() { - listCloudDatabaseClusterDatabasesCmd.Flags().String("namespace", "", "Name of the namespace cluster belongs to") + listCloudDatabaseClusterDatabasesCmd.Flags().StringP("namespace", "n", "", "Namespace") listCloudDatabaseClusterDatabasesCmd.Flags().String("cluster", "", "Name of the cluster") listCloudDatabaseClusterDatabasesCmd.MarkFlagRequired("namespace") listCloudDatabaseClusterDatabasesCmd.MarkFlagRequired("cluster") cloudDatabaseClusterDatabaseCmd.AddCommand(listCloudDatabaseClusterDatabasesCmd) - deleteCloudDatabaseClusterDatabaseCmd.Flags().String("namespace", "", "Name of the namespace cluster belongs to") + deleteCloudDatabaseClusterDatabaseCmd.Flags().StringP("namespace", "n", "", "Namespace") deleteCloudDatabaseClusterDatabaseCmd.Flags().String("cluster", "", "Name of the cluster") deleteCloudDatabaseClusterDatabaseCmd.Flags().String("name", "", "Name of the database we want to delete") deleteCloudDatabaseClusterDatabaseCmd.MarkFlagRequired("namespace") @@ -119,7 +119,7 @@ func init() { deleteCloudDatabaseClusterDatabaseCmd.MarkFlagRequired("name") cloudDatabaseClusterDatabaseCmd.AddCommand(deleteCloudDatabaseClusterDatabaseCmd) - createCloudDatabaseClusterDatabaseCmd.Flags().String("namespace", "", "Name of namespace to create the cluster in") + createCloudDatabaseClusterDatabaseCmd.Flags().StringP("namespace", "n", "", "Namespace") createCloudDatabaseClusterDatabaseCmd.Flags().String("cluster", "", "Name of the cluster") createCloudDatabaseClusterDatabaseCmd.Flags().String("name", "", "Name of the database we want to create") createCloudDatabaseClusterDatabaseCmd.Flags().String("description", "", "Description of the database") diff --git a/cmd/cloudDatabaseClusterExternalConnection.go b/cmd/cloudDatabaseClusterExternalConnection.go new file mode 100644 index 0000000..7757cb9 --- /dev/null +++ b/cmd/cloudDatabaseClusterExternalConnection.go @@ -0,0 +1,97 @@ +package cmd + +import ( + "fmt" + "log" + + "github.com/nexaa-cloud/nexaa-cli/api" + "github.com/spf13/cobra" +) + +var cloudDatabaseClusterEnableExternalConnectionCmd = &cobra.Command{ + Use: "external-connection", + Short: "Enable or Disable external connection on a cloud database cluster", +} + +var enableCloudDatabaseClusterExternalConnectionCmd = &cobra.Command{ + Use: "enable", + Short: "Enable external connection on a cloud database cluster", + Run: func(cmd *cobra.Command, args []string) { + namespace, _ := cmd.Flags().GetString("namespace") + clusterName, _ := cmd.Flags().GetString("cluster") + allowedIp, _ := cmd.Flags().GetStringArray("allowed-ip") + + allowList := make([]api.AllowListInput, 0) + for _, ip := range allowedIp { + allowList = append(allowList, api.AllowListInput{Ip: ip, State: api.StatePresent}) + } + + resource := api.CloudDatabaseClusterModifyInput{ + Name: clusterName, + Namespace: namespace, + ExternalConnection: &api.ExternalConnectionInput{ + State: api.StatePresent, + SharedIp: true, + Ports: []api.ExternalConnectionPortInput{ + { + AllowList: allowList, + State: api.StatePresent, + }, + }, + }, + } + + client := api.NewClient() + + cluster, err := client.CloudDatabaseClusterModify(resource) + if err != nil { + log.Fatalf("Failed to enable external connection in cluster %q/%q: %v", namespace, clusterName, err) + return + } + fmt.Printf("External connection enabled. Reachable at:\n") + fmt.Printf("Ipv4: %s:%d \n", cluster.ExternalConnection.Ipv4, cluster.ExternalConnection.Ports[0].ExternalPort) + fmt.Printf("Ipv6: %s:%d \n", cluster.ExternalConnection.Ipv6, cluster.ExternalConnection.Ports[0].ExternalPort) + }, +} + +var disableCloudDatabaseClusterExternalConnectionCmd = &cobra.Command{ + Use: "disable", + Short: "disable external connection on a cloud database cluster", + Run: func(cmd *cobra.Command, args []string) { + namespace, _ := cmd.Flags().GetString("namespace") + clusterName, _ := cmd.Flags().GetString("cluster") + + resource := api.CloudDatabaseClusterModifyInput{ + Name: clusterName, + Namespace: namespace, + ExternalConnection: &api.ExternalConnectionInput{ + State: api.StateAbsent, + Ports: []api.ExternalConnectionPortInput{}, + }, + } + + client := api.NewClient() + + cluster, err := client.CloudDatabaseClusterModify(resource) + if err != nil { + log.Fatalf("Failed to disable external connection in cluster %q/%q: %v", namespace, clusterName, err) + return + } + fmt.Printf("External connection disabled in: %s/%s. \n", cluster.Namespace.Name, cluster.Name) + }, +} + +func init() { + enableCloudDatabaseClusterExternalConnectionCmd.Flags().StringP("namespace", "n", "", "Namespace") + enableCloudDatabaseClusterExternalConnectionCmd.Flags().String("cluster", "", "Name of the cluster") + enableCloudDatabaseClusterExternalConnectionCmd.Flags().StringArray("allowed-ip", []string{"0.0.0.0/0", "::/0"}, "Allowed ip for the connection") + enableCloudDatabaseClusterExternalConnectionCmd.MarkFlagRequired("namespace") + enableCloudDatabaseClusterExternalConnectionCmd.MarkFlagRequired("cluster") + cloudDatabaseClusterEnableExternalConnectionCmd.AddCommand(enableCloudDatabaseClusterExternalConnectionCmd) + + disableCloudDatabaseClusterExternalConnectionCmd.Flags().StringP("namespace", "n", "", "Namespace") + disableCloudDatabaseClusterExternalConnectionCmd.Flags().String("cluster", "", "Name of the cluster") + disableCloudDatabaseClusterExternalConnectionCmd.MarkFlagRequired("namespace") + disableCloudDatabaseClusterExternalConnectionCmd.MarkFlagRequired("cluster") + cloudDatabaseClusterEnableExternalConnectionCmd.AddCommand(disableCloudDatabaseClusterExternalConnectionCmd) +} diff --git a/cmd/container.go b/cmd/container.go index 461133a..a5dc90c 100644 --- a/cmd/container.go +++ b/cmd/container.go @@ -17,7 +17,7 @@ var containerCmd = &cobra.Command{ var getContainerCmd = &cobra.Command{ Use: "get", - Short: "Get details of a container job", + Short: "Get details of a container", Run: func(cmd *cobra.Command, args []string) { namespace, _ := cmd.Flags().GetString("namespace") name, _ := cmd.Flags().GetString("name") @@ -251,7 +251,7 @@ var deleteContainerCmd = &cobra.Command{ } func init() { - createContainerCmd.Flags().String("namespace", "", "Namespace") + createContainerCmd.Flags().StringP("namespace", "n", "", "Namespace") createContainerCmd.Flags().String("name", "", "Name for the container") createContainerCmd.Flags().String("image", "", "Container image") createContainerCmd.Flags().String("resources", "", "Container resources") @@ -264,7 +264,7 @@ func init() { createContainerCmd.Flags().StringArray("command", []string{}, "Command to run in the container") containerCmd.AddCommand(createContainerCmd) - createStarterContainerCmd.Flags().String("namespace", "", "Namespace") + createStarterContainerCmd.Flags().StringP("namespace", "n", "", "Namespace") createStarterContainerCmd.Flags().String("name", "", "Name for the container") createStarterContainerCmd.Flags().String("image", "", "Container image") createStarterContainerCmd.Flags().StringArray("env", []string{}, "Container environment variables") @@ -276,7 +276,7 @@ func init() { createStarterContainerCmd.MarkFlagRequired("image") containerCmd.AddCommand(createStarterContainerCmd) - modifyContainerCmd.Flags().String("namespace", "", "Namespace") + modifyContainerCmd.Flags().StringP("namespace", "n", "", "Namespace") modifyContainerCmd.Flags().String("name", "", "Name for the container") modifyContainerCmd.Flags().String("image", "", "Container image") modifyContainerCmd.Flags().String("resources", "", "Container resources") @@ -291,19 +291,21 @@ func init() { modifyContainerCmd.MarkFlagRequired("name") containerCmd.AddCommand(modifyContainerCmd) - listContainersCmd.Flags().String("namespace", "", "Namespace") + listContainersCmd.Flags().StringP("namespace", "n", "", "Namespace") listContainersCmd.MarkFlagRequired("namespace") containerCmd.AddCommand(listContainersCmd) - deleteContainerCmd.Flags().String("namespace", "", "Namespace") + deleteContainerCmd.Flags().StringP("namespace", "n", "", "Namespace") deleteContainerCmd.Flags().String("name", "", "Name of this container") deleteContainerCmd.MarkFlagRequired("namespace") deleteContainerCmd.MarkFlagRequired("name") containerCmd.AddCommand(deleteContainerCmd) - getContainerCmd.Flags().String("namespace", "", "Namespace") + getContainerCmd.Flags().StringP("namespace", "n", "", "Namespace") getContainerCmd.Flags().String("name", "", "Name of the container") getContainerCmd.MarkFlagRequired("namespace") getContainerCmd.MarkFlagRequired("Name") - containerCmd.AddCommand(getContainerJobCmd) + containerCmd.AddCommand(getContainerCmd) + + containerCmd.AddCommand(containerEnableExternalConnectionCmd) } diff --git a/cmd/containerExternalConnection.go b/cmd/containerExternalConnection.go new file mode 100644 index 0000000..0ca18e0 --- /dev/null +++ b/cmd/containerExternalConnection.go @@ -0,0 +1,214 @@ +package cmd + +import ( + "fmt" + "log" + "os" + "strings" + "text/tabwriter" + + "github.com/nexaa-cloud/nexaa-cli/api" + "github.com/spf13/cobra" +) + +var containerEnableExternalConnectionCmd = &cobra.Command{ + Use: "external-connection", + Short: "Enable or Disable external connection on a cloud database cluster", +} + +var enableContainerExternalConnectionCmd = &cobra.Command{ + Use: "enable", + Short: "Enable external connection on a cloud database cluster", + Run: func(cmd *cobra.Command, args []string) { + namespace, _ := cmd.Flags().GetString("namespace") + containerName, _ := cmd.Flags().GetString("name") + allowedIp, _ := cmd.Flags().GetStringArray("allowed-ip") + internalPort, _ := cmd.Flags().GetInt("internal-port") + externalPort, _ := cmd.Flags().GetInt("external-port") + protocol, _ := cmd.Flags().GetString("protocol") + + if internalPort == 0 { + log.Fatalf("Internal port must be provided and cannot be 0") + return + } + + allowList := make([]api.AllowListInput, 0) + for _, ip := range allowedIp { + allowList = append(allowList, api.AllowListInput{Ip: ip, State: api.StatePresent}) + } + + var resource api.ContainerModifyInput + + if externalPort == 0 { + resource = api.ContainerModifyInput{ + Name: containerName, + Namespace: namespace, + ExternalConnection: &api.ExternalConnectionInput{ + State: api.StatePresent, + SharedIp: true, + Ports: []api.ExternalConnectionPortInput{ + { + AllowList: allowList, + State: api.StatePresent, + InternalPort: &internalPort, + Protocol: api.Protocol(protocol), + }, + }, + }, + } + } else { + resource = api.ContainerModifyInput{ + Name: containerName, + Namespace: namespace, + ExternalConnection: &api.ExternalConnectionInput{ + State: api.StatePresent, + SharedIp: true, + Ports: []api.ExternalConnectionPortInput{ + { + AllowList: allowList, + State: api.StatePresent, + InternalPort: &internalPort, + ExternalPort: &externalPort, + Protocol: api.Protocol(protocol), + }, + }, + }, + } + } + + client := api.NewClient() + + container, err := client.ContainerModify(resource) + if err != nil { + log.Fatalf("Failed to enable external connection in cluster %q/%q: %v", namespace, containerName, err) + return + } + + fmt.Printf("External connection enabled.\n") + printConnections(container) + }, +} + +var disableContainerExternalConnectionCmd = &cobra.Command{ + Use: "disable", + Short: "disable external connection on a container", + Run: func(cmd *cobra.Command, args []string) { + namespace, _ := cmd.Flags().GetString("namespace") + name, _ := cmd.Flags().GetString("name") + externalPort, _ := cmd.Flags().GetInt("external-port") + + client := api.NewClient() + + // If externalPort is not provided, it will disable all external connections on the container + var resource api.ContainerModifyInput + if externalPort == 0 { + resource = api.ContainerModifyInput{ + Name: name, + Namespace: namespace, + ExternalConnection: &api.ExternalConnectionInput{ + State: api.StateAbsent, + Ports: []api.ExternalConnectionPortInput{}, + }, + } + } else { + ports := []api.ExternalConnectionPortInput{} + + ports = append(ports, api.ExternalConnectionPortInput{ + ExternalPort: &externalPort, + State: api.StateAbsent, + Protocol: api.ProtocolUdp, + AllowList: []api.AllowListInput{}, + }) + + resource = api.ContainerModifyInput{ + Name: name, + Namespace: namespace, + ExternalConnection: &api.ExternalConnectionInput{ + State: api.StatePresent, + Ports: ports, + }, + } + } + + container, err := client.ContainerModify(resource) + + if err != nil { + log.Fatalf("Failed to disable external connection in cluster %q/%q: %v", namespace, name, err) + return + } + fmt.Printf("External connection disabled in: %s/%s. \n", namespace, name) + + printConnections(container) + }, +} + +var listContainerExternalConnectionCmd = &cobra.Command{ + Use: "list", + Short: "list external connection on a cloud database cluster", + Run: func(cmd *cobra.Command, args []string) { + namespace, _ := cmd.Flags().GetString("namespace") + name, _ := cmd.Flags().GetString("name") + + client := api.NewClient() + container, err := client.ListContainerByName(namespace, name) + + if err != nil { + log.Fatalf("Container %q/%q not found: %v", namespace, name, err) + return + } + + if container.ExternalConnection == nil || len(container.ExternalConnection.Ports) == 0 { + log.Printf("No external connections enabled on %q/%q.", namespace, name) + return + } + + printConnections(container) + }, +} + +func printConnections(container api.ContainerResult) { + writer := tabwriter.NewWriter(os.Stdout, 0, 0, 3, ' ', tabwriter.Debug) + fmt.Fprintln(writer, "IPV4\t IPV6\t EXTERNAL PORT\t INTERNAL PORT\t PROTOCOL\t ALLOWLIST\t") + + for _, port := range container.ExternalConnection.Ports { + fmt.Fprintf( + writer, + "%s\t %s\t %d\t %d\t %s\t %s\n", + container.ExternalConnection.Ipv4, + container.ExternalConnection.Ipv4, + port.ExternalPort, + *port.InternalPort, + port.Protocol, + strings.Join(port.AllowList, ","), + ) + } + + writer.Flush() +} + +func init() { + enableContainerExternalConnectionCmd.Flags().StringP("namespace", "n", "", "Namespace") + enableContainerExternalConnectionCmd.Flags().String("name", "", "Name of the container") + enableContainerExternalConnectionCmd.Flags().StringArray("allowed-ip", []string{"0.0.0.0/0", "::/0"}, "Allowed ip for the connection") + enableContainerExternalConnectionCmd.Flags().Int("internal-port", 0, "Internal port to enable external connection on") + enableContainerExternalConnectionCmd.Flags().Int("external-port", 0, "Internal port to enable external connection on") + enableContainerExternalConnectionCmd.Flags().String("protocol", "TCP", "Protocol for the external connection (tcp or udp)") + enableContainerExternalConnectionCmd.MarkFlagRequired("namespace") + enableContainerExternalConnectionCmd.MarkFlagRequired("name") + enableContainerExternalConnectionCmd.MarkFlagRequired("internal-port") + containerEnableExternalConnectionCmd.AddCommand(enableContainerExternalConnectionCmd) + + disableContainerExternalConnectionCmd.Flags().StringP("namespace", "n", "", "Namespace") + disableContainerExternalConnectionCmd.Flags().String("name", "", "Name of the container") + disableContainerExternalConnectionCmd.Flags().Int("external-port", 0, "External port to disable") + disableContainerExternalConnectionCmd.MarkFlagRequired("namespace") + disableContainerExternalConnectionCmd.MarkFlagRequired("name") + containerEnableExternalConnectionCmd.AddCommand(disableContainerExternalConnectionCmd) + + listContainerExternalConnectionCmd.Flags().StringP("namespace", "n", "", "Namespace") + listContainerExternalConnectionCmd.Flags().String("name", "", "Name of the container") + listContainerExternalConnectionCmd.MarkFlagRequired("namespace") + listContainerExternalConnectionCmd.MarkFlagRequired("name") + containerEnableExternalConnectionCmd.AddCommand(listContainerExternalConnectionCmd) + +} diff --git a/cmd/container_job.go b/cmd/container_job.go index 7200c71..e8b5c5b 100644 --- a/cmd/container_job.go +++ b/cmd/container_job.go @@ -205,7 +205,7 @@ var deleteContainerJobCmd = &cobra.Command{ } func init() { - createContainerJobCmd.Flags().String("namespace", "", "Namespace") + createContainerJobCmd.Flags().StringP("namespace", "n", "", "Namespace") createContainerJobCmd.Flags().String("name", "", "Name for this container job") createContainerJobCmd.Flags().String("image", "", "Container job image") createContainerJobCmd.Flags().String("resources", "", "Container job resources") @@ -222,7 +222,7 @@ func init() { createContainerJobCmd.MarkFlagRequired("schedule") containerJobCmd.AddCommand(createContainerJobCmd) - modifyContainerJobCmd.Flags().String("namespace", "", "Namespace") + modifyContainerJobCmd.Flags().StringP("namespace", "n", "", "Namespace") modifyContainerJobCmd.Flags().String("name", "", "Name for this container job") modifyContainerJobCmd.Flags().String("image", "", "Container job image") modifyContainerJobCmd.Flags().String("resources", "", "Container job resources") @@ -237,17 +237,17 @@ func init() { modifyContainerJobCmd.MarkFlagRequired("name") containerJobCmd.AddCommand(modifyContainerJobCmd) - listContainerJobsCmd.Flags().String("namespace", "", "Namespace") + listContainerJobsCmd.Flags().StringP("namespace", "n", "", "Namespace") listContainerJobsCmd.MarkFlagRequired("namespace") containerJobCmd.AddCommand(listContainerJobsCmd) - deleteContainerJobCmd.Flags().String("namespace", "", "Namespace") + deleteContainerJobCmd.Flags().StringP("namespace", "n", "", "Namespace") deleteContainerJobCmd.Flags().String("name", "", "Name of the containerjob") deleteContainerJobCmd.MarkFlagRequired("namespace") deleteContainerJobCmd.MarkFlagRequired("name") containerJobCmd.AddCommand(deleteContainerJobCmd) - getContainerJobCmd.Flags().String("namespace", "", "Namespace") + getContainerJobCmd.Flags().StringP("namespace", "n", "", "Namespace") getContainerJobCmd.Flags().String("name", "", "Name of the container job") getContainerJobCmd.MarkFlagRequired("namespace") getContainerJobCmd.MarkFlagRequired("Name") diff --git a/cmd/messageQueue.go b/cmd/messageQueue.go index 9e2f774..f9167c3 100644 --- a/cmd/messageQueue.go +++ b/cmd/messageQueue.go @@ -234,14 +234,14 @@ func init() { messageQueueCmd.AddCommand(listMessageQueuesCmd) // Get command - getMessageQueueCmd.Flags().String("namespace", "", "Namespace") + getMessageQueueCmd.Flags().StringP("namespace", "n", "", "Namespace") getMessageQueueCmd.Flags().String("name", "", "Name of the message queue") getMessageQueueCmd.MarkFlagRequired("namespace") getMessageQueueCmd.MarkFlagRequired("name") messageQueueCmd.AddCommand(getMessageQueueCmd) // Create command - createMessageQueueCmd.Flags().String("namespace", "", "Namespace") + createMessageQueueCmd.Flags().StringP("namespace", "n", "", "Namespace") createMessageQueueCmd.Flags().String("name", "", "Name for the message queue") createMessageQueueCmd.Flags().String("plan", "", "Plan ID for the message queue") createMessageQueueCmd.Flags().String("type", "", "Type of the message queue (e.g., RabbitMQ)") @@ -255,7 +255,7 @@ func init() { messageQueueCmd.AddCommand(createMessageQueueCmd) // Delete command - deleteMessageQueueCmd.Flags().String("namespace", "", "Namespace") + deleteMessageQueueCmd.Flags().StringP("namespace", "n", "", "Namespace") deleteMessageQueueCmd.Flags().String("name", "", "Name of the message queue") deleteMessageQueueCmd.MarkFlagRequired("namespace") deleteMessageQueueCmd.MarkFlagRequired("name") @@ -268,11 +268,13 @@ func init() { messageQueueCmd.AddCommand(listMessageQueueVersionsCmd) // Admin credentials command - listAdminUserCredentialsCmd.Flags().String("namespace", "", "Namespace name") + listAdminUserCredentialsCmd.Flags().StringP("namespace", "n", "", "Namespace") listAdminUserCredentialsCmd.Flags().String("name", "", "Name of the message queue") listAdminUserCredentialsCmd.Flags().String("username", "", "Admin username") listAdminUserCredentialsCmd.MarkFlagRequired("namespace") listAdminUserCredentialsCmd.MarkFlagRequired("name") listAdminUserCredentialsCmd.MarkFlagRequired("username") messageQueueCmd.AddCommand(listAdminUserCredentialsCmd) + + messageQueueCmd.AddCommand(messageQueueEnableExternalConnectionCmd) } diff --git a/cmd/messageQueueExternalConnection.go b/cmd/messageQueueExternalConnection.go new file mode 100644 index 0000000..06af6f5 --- /dev/null +++ b/cmd/messageQueueExternalConnection.go @@ -0,0 +1,97 @@ +package cmd + +import ( + "fmt" + "log" + + "github.com/nexaa-cloud/nexaa-cli/api" + "github.com/spf13/cobra" +) + +var messageQueueEnableExternalConnectionCmd = &cobra.Command{ + Use: "external-connection", + Short: "Enable or Disable external connection on a cloud database cluster", +} + +var enableMessageQueueExternalConnectionCmd = &cobra.Command{ + Use: "enable", + Short: "Enable external connection on a cloud database cluster", + Run: func(cmd *cobra.Command, args []string) { + namespace, _ := cmd.Flags().GetString("namespace") + clusterName, _ := cmd.Flags().GetString("cluster") + allowedIp, _ := cmd.Flags().GetStringArray("allowed-ip") + + allowList := make([]api.AllowListInput, 0) + for _, ip := range allowedIp { + allowList = append(allowList, api.AllowListInput{Ip: ip, State: api.StatePresent}) + } + + resource := api.MessageQueueModifyInput{ + Name: clusterName, + Namespace: namespace, + ExternalConnection: &api.ExternalConnectionInput{ + State: api.StatePresent, + SharedIp: true, + Ports: []api.ExternalConnectionPortInput{ + { + AllowList: allowList, + State: api.StatePresent, + }, + }, + }, + } + + client := api.NewClient() + + cluster, err := client.MessageQueueModify(resource) + if err != nil { + log.Fatalf("Failed to enable external connection in cluster %q/%q: %v", namespace, clusterName, err) + return + } + fmt.Printf("External connection enabled. Reachable at:\n") + fmt.Printf("Ipv4: %s:%d \n", cluster.ExternalConnection.Ipv4, cluster.ExternalConnection.Ports[0].ExternalPort) + fmt.Printf("Ipv6: %s:%d \n", cluster.ExternalConnection.Ipv6, cluster.ExternalConnection.Ports[0].ExternalPort) + }, +} + +var disableMessageQueueExternalConnectionCmd = &cobra.Command{ + Use: "disable", + Short: "disable external connection on a cloud database cluster", + Run: func(cmd *cobra.Command, args []string) { + namespace, _ := cmd.Flags().GetString("namespace") + clusterName, _ := cmd.Flags().GetString("cluster") + + resource := api.MessageQueueModifyInput{ + Name: clusterName, + Namespace: namespace, + ExternalConnection: &api.ExternalConnectionInput{ + State: api.StateAbsent, + Ports: []api.ExternalConnectionPortInput{}, + }, + } + + client := api.NewClient() + + cluster, err := client.MessageQueueModify(resource) + if err != nil { + log.Fatalf("Failed to disable external connection in cluster %q/%q: %v", namespace, clusterName, err) + return + } + fmt.Printf("External connection disabled in: %s/%s. \n", cluster.Namespace.Name, cluster.Name) + }, +} + +func init() { + enableMessageQueueExternalConnectionCmd.Flags().StringP("namespace", "n", "", "Namespace") + enableMessageQueueExternalConnectionCmd.Flags().String("cluster", "", "Name of the cluster") + enableMessageQueueExternalConnectionCmd.Flags().StringArray("allowed-ip", []string{"0.0.0.0/0", "::/0"}, "Allowed ip for the connection") + enableMessageQueueExternalConnectionCmd.MarkFlagRequired("namespace") + enableMessageQueueExternalConnectionCmd.MarkFlagRequired("cluster") + messageQueueEnableExternalConnectionCmd.AddCommand(enableMessageQueueExternalConnectionCmd) + + disableMessageQueueExternalConnectionCmd.Flags().StringP("namespace", "n", "", "Namespace") + disableMessageQueueExternalConnectionCmd.Flags().String("cluster", "", "Name of the cluster") + disableMessageQueueExternalConnectionCmd.MarkFlagRequired("namespace") + disableMessageQueueExternalConnectionCmd.MarkFlagRequired("cluster") + messageQueueEnableExternalConnectionCmd.AddCommand(disableMessageQueueExternalConnectionCmd) +} diff --git a/cmd/registry.go b/cmd/registry.go index f3c24f6..f0ae7f0 100644 --- a/cmd/registry.go +++ b/cmd/registry.go @@ -100,11 +100,11 @@ var deleteRegistryCmd = &cobra.Command{ } func init() { - listRegistriesCmd.Flags().StringP("namespace", "", "", "Namespace") + listRegistriesCmd.Flags().StringP("namespace", "n", "", "Namespace") listRegistriesCmd.MarkFlagRequired("namespace") registryCmd.AddCommand(listRegistriesCmd) - createRegistryCmd.Flags().String("namespace", "", "Namespace") + createRegistryCmd.Flags().StringP("namespace", "n", "", "Namespace") createRegistryCmd.Flags().String("name", "", "Name for the private registry") createRegistryCmd.Flags().String("source", "", "Source URL for the private registry") createRegistryCmd.Flags().String("username", "", "Username for the private registry") @@ -116,7 +116,7 @@ func init() { createRegistryCmd.MarkFlagRequired("password") registryCmd.AddCommand(createRegistryCmd) - deleteRegistryCmd.Flags().String("namespace", "", "Namespace") + deleteRegistryCmd.Flags().StringP("namespace", "n", "", "Namespace") deleteRegistryCmd.Flags().String("name", "", "Name of the private registry") deleteRegistryCmd.MarkFlagRequired("namespace") deleteRegistryCmd.MarkFlagRequired("name") diff --git a/cmd/volume.go b/cmd/volume.go index 8e7b8cb..f2e082a 100644 --- a/cmd/volume.go +++ b/cmd/volume.go @@ -120,11 +120,11 @@ var deleteVolumeCmd = &cobra.Command{ } func init() { - listVolumesCmd.Flags().String("namespace", "", "Namespace") + listVolumesCmd.Flags().StringP("namespace", "n", "", "Namespace") listVolumesCmd.MarkFlagRequired("namespace") volumeCmd.AddCommand(listVolumesCmd) - createVolumeCmd.Flags().String("namespace", "", "Namespace") + createVolumeCmd.Flags().StringP("namespace", "n", "", "Namespace") createVolumeCmd.Flags().String("name", "", "Name for the volume") createVolumeCmd.Flags().Int("size", 0, "Size of the volume") createVolumeCmd.MarkFlagRequired("namespace") @@ -132,7 +132,7 @@ func init() { createVolumeCmd.MarkFlagRequired("size") volumeCmd.AddCommand(createVolumeCmd) - increaseVolumeCmd.Flags().String("namespace", "", "Namespace") + increaseVolumeCmd.Flags().StringP("namespace", "n", "", "Namespace") increaseVolumeCmd.Flags().String("name", "", "Name of the volume") increaseVolumeCmd.Flags().Int("size", 0, "Size of the volume") increaseVolumeCmd.MarkFlagRequired("namespace") @@ -140,7 +140,7 @@ func init() { increaseVolumeCmd.MarkFlagRequired("size") volumeCmd.AddCommand(increaseVolumeCmd) - deleteVolumeCmd.Flags().String("namespace", "", "Namespace") + deleteVolumeCmd.Flags().StringP("namespace", "n", "", "Namespace") deleteVolumeCmd.Flags().String("name", "", "name") deleteVolumeCmd.MarkFlagRequired("namespace") deleteVolumeCmd.MarkFlagRequired("name") diff --git a/operations/Container.graphql b/operations/Container.graphql index 04a14f2..928f095 100644 --- a/operations/Container.graphql +++ b/operations/Container.graphql @@ -11,6 +11,9 @@ fragment ContainerResult on Container { environmentVariables { ... EnvironmentVariableResult } + externalConnection { + ... ExternalConnectionResult + } ports ingresses { domainName diff --git a/operations/MessageQueue.graphql b/operations/MessageQueue.graphql index 354f3e2..8081772 100644 --- a/operations/MessageQueue.graphql +++ b/operations/MessageQueue.graphql @@ -11,6 +11,18 @@ fragment MessageQueueResult on MessageQueue { role status } + plan { + ...MessageQueuePlanResult + } + spec { + ...MessageQueueVersionResult + } + ingress { + ...MessageQueueIngressResult + } + externalConnection { + ...ExternalConnectionResult + } } fragment MessageQueuePlanResult on MessageQueuePlan { @@ -27,6 +39,10 @@ fragment MessageQueuePlanResult on MessageQueuePlan { storage(unit: GB) } +fragment MessageQueueIngressResult on MessageQueueIngress { + allowList +} + fragment MessageQueueVersionResult on MessageQueueSpec { patchLevelVersion type @@ -61,6 +77,14 @@ mutation messageQueueCreate($messageQueueInput: MessageQueueCreateInput!) { ...MessageQueueResult } } + +mutation messageQueueModify($messageQueueInput: MessageQueueModifyInput!) { + # @genqlient(flatten: true) + messageQueueModify(messageQueue: $messageQueueInput) { + ...MessageQueueResult + } +} + mutation messageQueueDelete($messageQueueInput: MessageQueueResourceInput!) { messageQueueDelete(messageQueue: $messageQueueInput) } diff --git a/operations/cloudDatabaseCluster.graphql b/operations/cloudDatabaseCluster.graphql index cde78ce..94d9f65 100644 --- a/operations/cloudDatabaseCluster.graphql +++ b/operations/cloudDatabaseCluster.graphql @@ -30,6 +30,9 @@ fragment CloudDatabaseClusterResult on CloudDatabaseCluster { adminUser { ...CloudDatabaseClusterUserResult } + externalConnection { + ...ExternalConnectionResult + } state locked } diff --git a/operations/generic.graphql b/operations/generic.graphql index e13e9f4..5d83ba6 100644 --- a/operations/generic.graphql +++ b/operations/generic.graphql @@ -10,4 +10,15 @@ fragment ContainerMounts on Mount { name size } +} + +fragment ExternalConnectionResult on ExternalConnection { + ipv4 + ipv6 + ports { + allowList + externalPort + internalPort + protocol + } } \ No newline at end of file diff --git a/schema.graphql b/schema.graphql index 5dd658f..f03dfdc 100644 --- a/schema.graphql +++ b/schema.graphql @@ -88,9 +88,64 @@ type CloudDatabase { whitelist: [String!]! } +""" +Enable this feature to get recommendations on how to improve your database usage. + +The tool will be providing you settings on a cluster level to tune your database, provide recommendations for +missing indexes and more. + +Database clusters will be analyzed once a day. +""" +input CloudDatabaseAdvisorInput { + "Set this field to `true` to enable recommendations on how to improve your database usage." + enabled: Boolean! = false +} + +type CloudDatabaseAdvisory implements CloudDatabaseAdvisoryInterface { + createdAt: String! + identifier: String! + message: String! +} + +interface CloudDatabaseAdvisoryInterface { + createdAt: String! + identifier: String! + message: String! +} + +type CloudDatabaseAdvisoryMissingIndex implements CloudDatabaseAdvisoryInterface { + createdAt: String! + databaseName: String! + identifier: String! + message: String! +} + +enum CloudDatabaseAdvisoryType { + MissingIndex + SettingSuggestion +} + type CloudDatabaseCluster { adminUser: DatabaseUser + + """ + + Cost: complexity = 10, multipliers = [type], defaultMultiplier = null + """ + advisories(type: CloudDatabaseAdvisoryType = null): [CloudDatabaseAdvisoryInterface!]! + databases: [Database!]! + externalConnection: ExternalConnection + + """ + Returns the features available on a cluster. + Features are extra functionality or capabilities for database clusters. + They are opt-in and provide extra services for your database. + + Cost: complexity = 10, multipliers = [], defaultMultiplier = null + """ + features: [CloudDatabaseClusterFeature!]! + hostname: String! id: String! locked: Boolean! @@ -103,6 +158,17 @@ type CloudDatabaseCluster { users: [DatabaseUser!]! } +type CloudDatabaseClusterAdvisor implements CloudDatabaseClusterFeature { + enabled: Boolean! + status: String! +} + +""" +Input for create cloud database cluster. + +A database cluster is accessible from within the namespace your created it in. +There is no limit on the number of users, or database. +""" input CloudDatabaseClusterCreateInput { "" name: String! @@ -121,6 +187,12 @@ input CloudDatabaseClusterCreateInput { "" users: [DatabaseUserInput!] = null + + "" + advisor: CloudDatabaseAdvisorInput = null + + "" + externalConnection: ExternalConnectionInput = null } input CloudDatabaseClusterDatabaseCreateInput { @@ -139,6 +211,22 @@ input CloudDatabaseClusterDatabaseResourceInput { name: String! } +interface CloudDatabaseClusterFeature { + enabled: Boolean! + status: String! +} + +type CloudDatabaseClusterFeatureImpl implements CloudDatabaseClusterFeature { + enabled: Boolean! + status: String! +} + +""" +Input for create cloud database cluster. + +A database cluster is accessible from within the namespace your created it in. +There is no limit on the number of users, or database. +""" input CloudDatabaseClusterModifyInput { "" name: String! @@ -151,6 +239,12 @@ input CloudDatabaseClusterModifyInput { "" users: [DatabaseUserInput!] + + "" + advisor: CloudDatabaseAdvisorInput + + "" + externalConnection: ExternalConnectionInput } input CloudDatabaseClusterResourceInput { @@ -193,54 +287,6 @@ input CloudDatabaseClusterUserResourceInput { name: String! } -input ConfigureContainerInput { - "" - containerId: Int! - - "" - resourceSpecificationId: Int = null - - "" - image: String = null - - "" - numberOfContainers: Int = null - - "" - environmentVariables: EnvironmentVariableModificationInput = null - - "" - ingresses: IngressModificationInput = null - - "" - unmount: [UnmountInput!] = null - - "" - ports: [String!] - - "" - privateRegistryId: Int = null - - "" - mounts: [MountInput!] - - """ - Health check performed to check the status of the container. - Health checks are directly performed on the container so your application must expose - the port. Port mappings specified in the ports field are not used by the health check. - - When you want to disable the health check you must send us a null value. To leave the - current health check unchanged you can omit this field. - """ - healthCheck: HealthCheckInput = null - - "" - autoScalingInput: AutoScalingInput = null - - "" - scaling: ScalingInput = null -} - type Container { autoScaling: AutoScaling availableReplicas: Int! @@ -250,6 +296,7 @@ type Container { deletedAt: DateTime @deprecated(reason: "this field will be removed in the future, and doesn't have a replacement") entrypoint: [String!] environmentVariables: [EnvironmentVariable!]! + externalConnection: ExternalConnection healthCheck: HealthCheck id: ID! image: String! @@ -341,6 +388,9 @@ input ContainerCreateInput { This field is defined in docker exec format. https://docs.docker.com/reference/dockerfile/#shell-and-exec-form """ command: [String!] + + "" + externalConnection: ExternalConnectionInput = null } input ContainerDeleteInput { @@ -351,6 +401,15 @@ input ContainerDeleteInput { namespace: String! } +type ContainerEndpoint { + allowList: [String!]! + containerPort: Int! + id: String! + ipv4Address: String! + ipv6Address: String! + port: Int! +} + type ContainerJob { command: [String!] enabled: Boolean! @@ -578,6 +637,9 @@ input ContainerModifyInput { This field is defined in docker exec format. https://docs.docker.com/reference/dockerfile/#shell-and-exec-form """ command: [String!] + + "" + externalConnection: ExternalConnectionInput } input ContainerResourceInput { @@ -720,54 +782,6 @@ enum CpuUnit { CPU } -input CreateContainerInput { - "" - namespaceId: Int! - - "" - resourceSpecificationId: Int! - - "" - name: String! - - "" - image: String! - - "" - replicas: Int = 1 - - "" - environmentVariables: [EnvironmentVariableInput!] = [] - - "" - ingresses: [IngressInput!] = [] - - "" - ports: [String!] - - "" - privateRegistryId: Int = null - - "" - mounts: [MountInput!] - - """ - Health check performed to check the status of the container. - Health checks are directly performed on the container so your application must expose - the port. Port mappings specified in the ports field are not used by the health check. - - When you want to disable the health check you must send us a null value. To leave the - current health check unchanged you can omit this field. - """ - healthCheck: HealthCheckInput = null - - "" - autoScalingInput: AutoScalingInput = null - - "" - scaling: ScalingInput = null -} - type Customer { address: Address @deprecated(reason: "this field will be removed in the future") billingPeriod: Int! @deprecated(reason: "this field will be removed in the future") @@ -781,6 +795,7 @@ type Customer { type Database { description: String + extensions: [Extension!]! name: String! status: String! } @@ -863,8 +878,16 @@ input DeleteRegistryConnectionInput { namespace: String! } +type Endpoint { + allowList: [String!]! + id: String! + ipv4Address: String! + ipv6Address: String! + port: Int! +} + type EnvironmentVariable { - id: ID! + id: ID! @deprecated(reason: "environment variables are identified by name") name: String! secret: Boolean! value: String @@ -884,15 +907,57 @@ input EnvironmentVariableInput { state: State! = PRESENT } -input EnvironmentVariableModificationInput { +type Extension { + name: String! +} + +type ExternalConnection { + ipv4: String! + ipv6: String! + ports: [ExternalConnectionPort!]! +} + +input ExternalConnectionInput { + "" + sharedIp: Boolean! = true + + "" + state: State! = PRESENT + + "" + ports: [ExternalConnectionPortInput!]! = [] +} + +type ExternalConnectionPort { + allowList: [String!]! + externalPort: Int! + internalPort: Int + protocol: Protocol! +} + +input ExternalConnectionPortInput { "" - remove: [RemoveEnvironmentVariableInput!] = null + externalPort: Int = null + + """ + Internal port is only used for external connections of containers. + For other resources, it's automatically selected + + See ports in `ContainerCreateInput` and `ContainerModifyInput` + """ + internalPort: Int = null + + """ + Protocol is only used for external connections of containers. + For other resources, only TCP is allowed. + """ + protocol: Protocol! = TCP "" - update: [UpdateEnvironmentVariableInput!] = null + state: State! = PRESENT "" - add: [EnvironmentVariableInput!] = null + allowList: [AllowListInput!]! = [] } type HealthCheck { @@ -934,17 +999,6 @@ input IngressInput { state: State! = PRESENT } -input IngressModificationInput { - "" - remove: [Int!] = null - - "" - update: [UpdateIngressInput!] = null - - "" - add: [IngressInput!] = null -} - type Location { id: Int! name: String! @@ -957,11 +1011,14 @@ input ManualScalingInput { type MessageQueue { adminUser: MessageQueueUser + externalConnection: ExternalConnection id: String! ingress: MessageQueueIngress! locked: Boolean! name: String! namespace: Namespace! + plan: MessageQueuePlan! + spec: MessageQueueSpec! state: String! } @@ -980,6 +1037,9 @@ input MessageQueueCreateInput { "" allowList: [AllowListInput!]! + + "" + externalConnection: ExternalConnectionInput = null } type MessageQueueIngress { @@ -990,6 +1050,20 @@ type MessageQueueIngress { tlsEnabled: Boolean! } +input MessageQueueModifyInput { + "" + name: String! + + "" + namespace: String! + + "" + allowList: [AllowListInput!] + + "" + externalConnection: ExternalConnectionInput +} + type MessageQueuePlan { benchmark: MessageQueuePlanBenchmark cpu(unit: CpuUnit = CPU): Float! @@ -1164,18 +1238,6 @@ type Mutation { """ - Cost: complexity = 100, multipliers = [], defaultMultiplier = null - """ - createCloudDatabase(customerId: Int!, name: String!, username: String!, version: String!, nodeType: String!, password: String!, location: String!, whitelist: [String!]! = []): Boolean! @deprecated(reason: "Use `createCloudDatabaseCluster` mutation instead") - - """ - - Cost: complexity = 100, multipliers = [], defaultMultiplier = null - """ - createContainer(containerInput: CreateContainerInput!): Boolean! @deprecated(reason: "use `containerCreate` mutation instead") - - """ - Cost: complexity = 100, multipliers = [], defaultMultiplier = null """ createNamespace(name: String!, customerId: Int = null, description: String = null, pricingPlanId: Int = 2, resourceSpecificationId: Int = null): Boolean! @deprecated(reason: "use `namespaceCreate` mutation") @@ -1188,12 +1250,6 @@ type Mutation { """ - Cost: complexity = 100, multipliers = [], defaultMultiplier = null - """ - deleteContainer(containerId: Int!): Boolean! @deprecated(reason: "use `containerDelete` mutation instead") - - """ - Cost: complexity = 100, multipliers = [], defaultMultiplier = null """ deleteNamespace(id: Int!): Boolean! @deprecated(reason: "use `namespaceDelete` mutation") @@ -1225,7 +1281,7 @@ type Mutation { Cost: complexity = 100, multipliers = [], defaultMultiplier = null """ - messageQueueCreate(messageQueue: MessageQueueCreateInput!): MessageQueue! + messageQueueCreate(messageQueue: MessageQueueCreateInput): MessageQueue! """ @@ -1237,7 +1293,7 @@ type Mutation { Cost: complexity = 100, multipliers = [], defaultMultiplier = null """ - messageQueueModify(messageQueue: CloudDatabaseClusterModifyInput): MessageQueue! + messageQueueModify(messageQueue: MessageQueueModifyInput): MessageQueue! """ @@ -1247,12 +1303,6 @@ type Mutation { """ - Cost: complexity = 100, multipliers = [], defaultMultiplier = null - """ - modifyContainer(containerInput: ConfigureContainerInput!): Boolean! @deprecated(reason: "use `containerModify` mutation instead") - - """ - Cost: complexity = 100, multipliers = [], defaultMultiplier = null """ namespaceCreate(namespaceInput: NamespaceCreateInput!): Namespace! @@ -1372,6 +1422,11 @@ type PrivateRegistry { username: String! } +enum Protocol { + TCP + UDP +} + type Query { """ Returns the current user account. @@ -1558,11 +1613,6 @@ input RegistryCreateInput { verify: Boolean! = true } -input RemoveEnvironmentVariableInput { - "" - name: String! -} - type Replica { name: String! status: String! @@ -1621,7 +1671,7 @@ enum Status { } type Subscription { - "A placeholder query used by thecodingmachine\/graphqlite when there are no declared subscriptions." + "A placeholder query used by thecodingmachine/graphqlite when there are no declared subscriptions." dummySubscription: String } @@ -1639,39 +1689,6 @@ enum Unit { TB } -input UnmountInput { - "Name of the volume to unmount" - volume: String! - - "Path to unmount the volume in the container." - path: String! -} - -input UpdateEnvironmentVariableInput { - "" - name: String! - - "" - value: String! -} - -input UpdateIngressInput { - "" - id: ID! - - "" - domainName: String! - - "" - port: Int! - - "" - enableTLS: Boolean! - - "" - whitelist: [String!] = null -} - type Volume { containerJobs: [ContainerJob!]! containers: [Container!]!