Documentation
¶
Index ¶
- Constants
- func CheckImmutableFields(m Model) error
- func RootFieldJSONNames(m Model) (fields []string)
- func ZeroPrivateFields(r Model)
- func ZeroReadonlyFields(r Model)
- type AWSKubeConfig
- type ActionStatus
- type BaseList
- type BaseModel
- type BelongsToField
- type CloudAccount
- type CloudAccountList
- type DOKubeConfig
- type Error
- type ErrorChangedImmutableField
- type GCEKubeConfig
- type HelmChart
- type HelmChartList
- type HelmRelease
- type HelmReleaseList
- type HelmRepo
- type HelmRepoList
- type Kube
- type KubeList
- type KubeResource
- type KubeResourceList
- type List
- type LoadBalancer
- type LoadBalancerList
- type Model
- type Node
- type NodeList
- type OSKubeConfig
- type PACKKubeConfig
- type ResourceMetrics
- type Session
- type SessionList
- type TaggedModelField
- type User
- type UserList
Constants ¶
const ( UserRoleAdmin = "admin" UserRoleUser = "user" )
Variables ¶
This section is empty.
Functions ¶
func CheckImmutableFields ¶ added in v0.11.1
CheckImmutableFields returns an error if any fields with the sg tag "immutable" have values (are not zero).
func RootFieldJSONNames ¶ added in v0.10.1
RootFieldJSONNames takes a model and returns the json name tag for every top-level field.
func ZeroPrivateFields ¶
func ZeroPrivateFields(r Model)
ZeroPrivateFields takes a Model with pointer, and zeroes any fields with the tag sg:"private".
func ZeroReadonlyFields ¶
func ZeroReadonlyFields(r Model)
ZeroReadonlyFields takes a Model with pointer, and zeroes any fields with the tag sg:"readonly".
Types ¶
type AWSKubeConfig ¶
type AWSKubeConfig struct {
Region string `json:"region" validate:"nonzero,regexp=^[a-z]{2}-[a-z]+-[0-9]$"`
AvailabilityZone string `json:"availability_zone"`
VPCIPRange string `json:"vpc_ip_range" validate:"nonzero" sg:"default=172.20.0.0/16"`
// TODO this should be a slice of objects instead of maps, since we have a rigid key structure
PublicSubnetIPRange []map[string]string `json:"public_subnet_ip_range"`
MultiAZ bool `json:"multi_az"`
BucketName string `json:"bucket_name,omitempty" sg:"readonly"`
NodeVolumeSize int `json:"node_volume_size" sg:"default=100"`
MasterVolumeSize int `json:"master_volume_size" sg:"default=100"`
LastSelectedAZ string `json:"last_selected_az" sg:"readonly"` // if using multiAZ this is the last az the node build used.
PrivateKey string `json:"private_key,omitempty" sg:"readonly"`
VPCID string `json:"vpc_id"`
VPCMANAGED bool `json:"vpc_managed"`
InternetGatewayID string `json:"internet_gateway_id"`
RouteTableID string `json:"route_table_id"`
RouteTableSubnetAssociationID []string `json:"route_table_subnet_association_id" sg:"readonly"`
PrivateNetwork bool `json:"private_network"`
ELBSecurityGroupID string `json:"elb_security_group_id" sg:"readonly"`
NodeSecurityGroupID string `json:"node_security_group_id" sg:"readonly"`
ElasticFileSystemID string `json:"elastic_filesystem_id"`
ElasticFileSystemTargets []string `json:"elastic_filesystem_targets" sg:"readonly"`
BuildElasticFileSystem bool `json:"build_elastic_filesystem"`
}
AWSKubeConfig holds aws specific information about AWS based KUbernetes clusters.
type ActionStatus ¶
type ActionStatus struct {
Description string `json:"description"`
MaxRetries int `json:"max_retries"`
Retries int `json:"retries"`
Error string `json:"error,omitempty"`
Cancelled bool `json:"cancelled,omitempty"`
StepsCompleted int `json:"steps_completed,omitempty"`
}
ActionStatus holds all the information pertaining to any running or failed Async Actions, and is rendered on the model on display (not persisted).
type BaseList ¶ added in v0.10.1
type BaseList struct {
// Filters input looks like this:
// {
// "name": [
// "this", "that"
// ],
// "other_field": [
// "thingy"
// ]
// }
// The values of each key are joined as OR queries.
// Multiple keys are joined as AND queries.
// The above translates to "(name=this OR name=that) AND (other_fied=thingy)".
Filters map[string][]string `json:"filters"`
// Pagination
Offset int64 `json:"offset"`
Limit int64 `json:"limit"`
Total int64 `json:"total"`
}
func (BaseList) QueryValues ¶ added in v0.10.1
type BaseModel ¶
type BaseModel struct {
ID *int64 `gorm:"primary_key" json:"id,omitempty" sg:"readonly"`
UUID string `json:"uuid" gorm:"not null" sg:"readonly"`
CreatedAt time.Time `json:"created_at" sg:"readonly"`
UpdatedAt time.Time `json:"updated_at" sg:"readonly"`
Status *ActionStatus `gorm:"-" json:"status,omitempty"`
PassiveStatus string `gorm:"-" json:"passive_status,omitempty"`
PassiveStatusOkay bool `gorm:"-" json:"passive_status_okay,omitempty"`
}
BaseModel implements the Model interface, and is composed into all persisted Supergiant resources.
func (*BaseModel) SetActionStatus ¶
func (m *BaseModel) SetActionStatus(status *ActionStatus)
SetActionStatus takes an *ActionStatus and sets it on the model.
func (*BaseModel) SetPassiveStatus ¶ added in v0.11.0
func (m *BaseModel) SetPassiveStatus()
SetPassiveStatus implements the Model interface, but does nothing. It can be used by models to set render the PassiveStatus and PassiveStatusOkay fields.
type BelongsToField ¶
type BelongsToField struct {
Field reflect.StructField
Value reflect.Value
}
BelongsToField holds the reflect StructField (type) and Value of a model field representing the parent object in a belongs_to relation.
type CloudAccount ¶
type CloudAccount struct {
BaseModel
// has_many Kubes
Kubes []*Kube `json:"kubes,omitempty" gorm:"ForeignKey:CloudAccountName;AssociationForeignKey:Name"`
Name string `json:"name" validate:"nonzero" gorm:"not null;unique_index" sg:"immutable"`
Provider string `json:"provider" validate:"regexp=^(aws|digitalocean|openstack|gce|packet)$" gorm:"not null" sg:"immutable"`
// NOTE this is loose map to allow for multiple clouds (eventually)
Credentials map[string]string `json:"credentials,omitempty" validate:"nonzero" gorm:"-" sg:"store_as_json_in=CredentialsJSON,private,immutable"`
CredentialsJSON []byte `json:"-" gorm:"not null"`
}
type CloudAccountList ¶ added in v0.10.1
type CloudAccountList struct {
BaseList
Items []*CloudAccount `json:"items"`
}
type DOKubeConfig ¶ added in v0.10.0
type DOKubeConfig struct {
Region string `json:"region" validate:"nonzero"`
SSHKeyFingerprint []string `json:"ssh_key_fingerprint" validate:"nonzero"`
}
DOKubeConfig holds do specific information about DO based KUbernetes clusters.
type ErrorChangedImmutableField ¶ added in v0.11.1
type ErrorChangedImmutableField struct {
// contains filtered or unexported fields
}
ErrorChangedImmutableField is an error for when a model has a value defined in a field with the sg tag "immutable" (used for updates).
func (*ErrorChangedImmutableField) Error ¶ added in v0.11.1
func (err *ErrorChangedImmutableField) Error() string
type GCEKubeConfig ¶ added in v0.13.5
type GCEKubeConfig struct {
Zone string `json:"zone" validate:"nonzero"`
MasterInstanceGroup string `json:"master_instance_group" sg:"readonly"`
MinionInstanceGroup string `json:"minion_instance_group" sg:"readonly"`
MasterNodes []string `json:"master_nodes" sg:"readonly"`
MasterName string `json:"master_name" sg:"readonly"`
KubeMasterCount int `json:"kube_master_count"`
// Template vars
SSHPubKey string `json:"ssh_pub_key" validate:"nonzero"`
KubernetesVersion string `json:"kubernetes_version" validate:"nonzero" sg:"default=1.5.1"`
ETCDDiscoveryURL string `json:"etcd_discovery_url" sg:"readonly"`
MasterPrivateIP string `json:"master_private_ip" sg:"readonly"`
}
GCEKubeConfig holds do specific information about DO based KUbernetes clusters.
type HelmChart ¶ added in v0.14.0
type HelmChart struct {
BaseModel
// belongs_to Repo
Repo *HelmRepo `json:"repo,omitempty" gorm:"ForeignKey:RepoName;AssociationForeignKey:Name"`
RepoName string `json:"repo_name" validate:"nonzero" gorm:"not null;index" sg:"immutable"`
Name string `json:"name" validate:"nonzero" gorm:"not null;index" sg:"immutable"`
Version string `json:"version" validate:"nonzero"`
Description string `json:"description" validate:"nonzero"`
DefaultConfig map[string]interface{} `json:"default_config" gorm:"-" sg:"store_as_json_in=DefaultConfigJSON,immutable"`
DefaultConfigJSON []byte `json:"-"`
}
type HelmChartList ¶ added in v0.14.0
type HelmRelease ¶ added in v0.14.0
type HelmRelease struct {
BaseModel
// belongs_to Kube
Kube *Kube `json:"kube,omitempty" gorm:"ForeignKey:KubeName;AssociationForeignKey:Name"`
KubeName string `json:"kube_name" gorm:"not null;index" validate:"nonzero" sg:"immutable"`
// NOTE this is just a "soft" belongs_to.
// We don't do relation since there's no real need, and it complicates things.
RepoName string `json:"repo_name" gorm:"not null;index" validate:"nonzero" sg:"immutable"`
ChartName string `json:"chart_name" gorm:"not null;index" validate:"nonzero" sg:"immutable"`
ChartVersion string `json:"chart_version" validate:"nonzero" sg:"immutable"`
Name string `json:"name" validate:"regexp=^[\\w-\\.]*$" gorm:"index" sg:"immutable"`
Revision string `json:"revision"`
// TODO weird naming, but Status is already taken
StatusValue string `json:"status_value"`
UpdatedValue string `json:"updated_value"`
Config map[string]interface{} `json:"config" gorm:"-" sg:"store_as_json_in=ConfigJSON,immutable"`
ConfigJSON []byte `json:"-"`
}
func (*HelmRelease) SetPassiveStatus ¶ added in v0.14.0
func (m *HelmRelease) SetPassiveStatus()
type HelmReleaseList ¶ added in v0.14.0
type HelmReleaseList struct {
BaseList
Items []*HelmRelease `json:"items"`
}
type HelmRepo ¶ added in v0.14.0
type HelmRepo struct {
BaseModel
Name string `json:"name" validate:"nonzero" gorm:"not null;unique_index" sg:"immutable"`
URL string `json:"url" validate:"nonzero" gorm:"not null" sg:"immutable"`
// has_many Charts
Charts []*HelmChart `json:"charts,omitempty" gorm:"ForeignKey:RepoName;AssociationForeignKey:Name"`
}
type HelmRepoList ¶ added in v0.14.0
type Kube ¶
type Kube struct {
BaseModel
// belongs_to CloudAccount
CloudAccount *CloudAccount `json:"cloud_account,omitempty" gorm:"ForeignKey:CloudAccountName;AssociationForeignKey:Name"`
CloudAccountName string `json:"cloud_account_name" validate:"nonzero" gorm:"not null;index" sg:"immutable"`
// has_many Nodes
Nodes []*Node `json:"nodes,omitempty" gorm:"ForeignKey:KubeName;AssociationForeignKey:Name"`
// has_many LoadBalancers
LoadBalancers []*LoadBalancer `json:"load_balancers,omitempty" gorm:"ForeignKey:KubeName;AssociationForeignKey:Name"`
// has_many KubeResources
KubeResources []*KubeResource `json:"kube_resources,omitempty" gorm:"ForeignKey:KubeName;AssociationForeignKey:Name"`
// has_many HelmReleases
HelmReleases []*HelmRelease `json:"helm_releases,omitempty" gorm:"ForeignKey:KubeName;AssociationForeignKey:Name"`
Name string `json:"name" validate:"nonzero,max=12,regexp=^[a-z]([-a-z0-9]*[a-z0-9])?$" gorm:"not null;unique_index" sg:"immutable"`
// Kubernetes
KubernetesVersion string `json:"kubernetes_version" validate:"nonzero" sg:"default=1.5.7"`
SSHPubKey string `json:"ssh_pub_key"`
ETCDDiscoveryURL string `json:"etcd_discovery_url" sg:"readonly"`
// Kubernetes Master
MasterNodeSize string `json:"master_node_size" validate:"nonzero" sg:"immutable"`
MasterID string `json:"master_id" sg:"readonly"`
MasterPrivateIP string `json:"master_private_ip" sg:"readonly"`
KubeMasterCount int `json:"kube_master_count"`
MasterNodes []string `json:"master_nodes" gorm:"-" sg:"store_as_json_in=MasterNodesJSON"`
MasterNodesJSON []byte `json:"-"`
MasterName string `json:"master_name" sg:"readonly"`
CustomFiles string `json:"custom_files" sg:"readonly"`
ProviderString string `json:"provider_string" sg:"readonly"`
KubeProviderString string `json:"Kube_provider_string" sg:"readonly"`
ServiceString string `json:"service_string" sg:"readonly"`
NodeSizes []string `json:"node_sizes" gorm:"-" validate:"min=1" sg:"store_as_json_in=NodeSizesJSON"`
NodeSizesJSON []byte `json:"-" gorm:"not null"`
Username string `json:"username" validate:"nonzero" sg:"immutable"`
Password string `json:"password" validate:"nonzero" sg:"immutable"`
HeapsterVersion string `json:"heapster_version" validate:"nonzero" sg:"default=v1.1.0,immutable"`
HeapsterMetricResolution string `json:"heapster_metric_resolution" validate:"regexp=^([0-9]+[smhd])+$" sg:"default=20s,immutable"`
// NOTE due to how we marshal this as JSON, it's difficult to have this stored
// as an interface, because unmarshalling causes us to lose the underlying
// type. So, this is kindof like a whacky form of single-table inheritance.
AWSConfig *AWSKubeConfig `json:"aws_config,omitempty" gorm:"-" sg:"store_as_json_in=AWSConfigJSON,immutable"`
AWSConfigJSON []byte `json:"-"`
DigitalOceanConfig *DOKubeConfig `json:"digitalocean_config,omitempty" gorm:"-" sg:"store_as_json_in=DigitalOceanConfigJSON,immutable"`
DigitalOceanConfigJSON []byte `json:"-"`
OpenStackConfig *OSKubeConfig `json:"openstack_config,omitempty" gorm:"-" sg:"store_as_json_in=OpenStackConfigJSON,immutable"`
OpenStackConfigJSON []byte `json:"-"`
GCEConfig *GCEKubeConfig `json:"gce_config,omitempty" gorm:"-" sg:"store_as_json_in=GCEConfigJSON,immutable"`
GCEConfigJSON []byte `json:"-"`
PACKConfig *PACKKubeConfig `json:"packet_config,omitempty" gorm:"-" sg:"store_as_json_in=PACKConfigJSON,immutable"`
PACKConfigJSON []byte `json:"-"`
MasterPublicIP string `json:"master_public_ip" sg:"readonly"`
Ready bool `json:"ready" sg:"readonly" gorm:"index"`
}
Kube objects contains global info about kubernetes ckusters.
type KubeResource ¶ added in v0.11.0
type KubeResource struct {
BaseModel
// belongs_to Kube
Kube *Kube `json:"kube,omitempty" gorm:"ForeignKey:KubeName;AssociationForeignKey:Name"`
KubeName string `json:"kube_name" validate:"nonzero" gorm:"not null;unique_index:kube_namespace_kind_name"`
// Kind corresponds directly to the Kind of Kubernetes resource (e.g. Pod, Service, etc.)
Kind string `json:"kind" validate:"nonzero" gorm:"not null;unique_index:kube_namespace_kind_name"`
// Namespace corresponds directly to the name of the Kubernetes namespace.
Namespace string `json:"namespace" gorm:"unique_index:kube_namespace_kind_name"`
// Name corresponds directly to the name of the resource in Kubernetes.
Name string `json:"name" validate:"nonzero" gorm:"not null;unique_index:kube_namespace_kind_name"`
// Resource is where the actual Kubernetes definition is stored.
Resource *json.RawMessage `json:"resource" gorm:"-" sg:"store_as_json_in=ResourceJSON"`
ResourceJSON []byte `json:"-"`
// Started represents whether the resource exists in Kubernetes or not. If it
// is a Pod, it also means the Pod is running.
Started bool `json:"started" sg:"readonly"`
// This is used to store unstructured data such as metrics from Heapster.
ExtraData map[string]interface{} `json:"extra_data" gorm:"-" sg:"store_as_json_in=ExtraDataJSON,readonly"`
ExtraDataJSON []byte `json:"-"`
}
func (*KubeResource) SetPassiveStatus ¶ added in v0.11.0
func (m *KubeResource) SetPassiveStatus()
type KubeResourceList ¶ added in v0.11.0
type KubeResourceList struct {
BaseList
Items []*KubeResource `json:"items"`
}
type LoadBalancer ¶ added in v0.14.0
type LoadBalancer struct {
BaseModel
// belongs_to Kube
Kube *Kube `json:"kube,omitempty" gorm:"ForeignKey:KubeName;AssociationForeignKey:Name"`
KubeName string `json:"kube_name" gorm:"not null;unique_index:name_within_kube" validate:"nonzero" sg:"immutable"`
Name string `json:"name" validate:"nonzero,max=63" gorm:"not null;unique_index:name_within_kube" sg:"immutable"`
Namespace string `json:"namespace" validate:"nonzero" sg:"immutable"`
Selector map[string]string `json:"selector,omitempty" gorm:"-" sg:"store_as_json_in=SelectorJSON"`
SelectorJSON []byte `json:"-"`
Ports map[int]int `json:"ports,omitempty" gorm:"-" sg:"store_as_json_in=PortsJSON"`
PortsJSON []byte `json:"-"`
Address string `json:"address" sg:"readonly"`
}
type LoadBalancerList ¶ added in v0.14.0
type LoadBalancerList struct {
BaseList
Items []*LoadBalancer `json:"items"`
}
type Model ¶
type Model interface {
GetID() interface{}
GetUUID() string
SetUUID()
SetActionStatus(*ActionStatus)
SetPassiveStatus()
}
Model is an interface that defines the required behaviors of all stored (whether in memory or on disk) Supergiant data structure objects.
type Node ¶
type Node struct {
BaseModel
// belongs_to Kube
Kube *Kube `json:"kube,omitempty" gorm:"ForeignKey:KubeName;AssociationForeignKey:Name"`
KubeName string `json:"kube_name" gorm:"not null;index" validate:"nonzero" sg:"immutable"`
// This is the only input for Node
Size string `json:"size" validate:"nonzero" sg:"immutable"`
ProviderID string `json:"provider_id" sg:"readonly" gorm:"index"`
Name string `json:"name" sg:"readonly" gorm:"index"`
ExternalIP string `json:"external_ip" sg:"readonly"`
ProviderCreationTimestamp time.Time `json:"provider_creation_timestamp" sg:"readonly"`
OutOfDisk bool `json:"out_of_disk" sg:"readonly"`
ResourceMetrics
}
type OSKubeConfig ¶ added in v0.12.0
type OSKubeConfig struct {
Region string `json:"region" validate:"nonzero"`
PrivateSubnetRange string `json:"private_subnet_ip_range" validate:"nonzero" sg:"default=172.20.0.0/24"`
PublicGatwayID string `json:"public_gateway_id" validate:"nonzero" sg:"default=disabled"`
NetworkID string `json:"network_id" sg:"readonly"`
SubnetID string `json:"subnet_id" sg:"readonly"`
RouterID string `json:"router_id" sg:"readonly"`
FloatingIPID string `json:"floating_ip_id" sg:"readonly"`
ImageName string `json:"image_name" validate:"nonzero"`
}
OSKubeConfig holds do specific information about Open Stack based KUbernetes clusters.
type PACKKubeConfig ¶ added in v0.14.5
type PACKKubeConfig struct {
Project string `json:"project" validate:"nonzero"`
ProjectID string `json:"project_id" sg:"readonly"`
Facility string `json:"facility" validate:"nonzero"`
MasterNodes []string `json:"master_nodes" sg:"readonly"`
MasterName string `json:"master_name" sg:"readonly"`
KubeMasterCount int `json:"kube_master_count"`
MasterPrivateIP string `json:"master_private_ip" sg:"readonly"`
ETCDDiscoveryURL string `json:"etcd_discovery_url" sg:"readonly"`
SSHPubKey string `json:"ssh_pub_key" validate:"nonzero"`
KubernetesVersion string `json:"kubernetes_version" validate:"nonzero" sg:"default=1.5.1"`
}
type ResourceMetrics ¶
type Session ¶
type Session struct {
ID string `json:"id"`
UserID *int64 `json:"user_id"`
CreatedAt time.Time `json:"created_at"`
User *User `json:"user"`
}
func (*Session) Description ¶
func (*Session) SetActionStatus ¶
func (m *Session) SetActionStatus(status *ActionStatus)
func (*Session) SetPassiveStatus ¶ added in v0.11.0
func (m *Session) SetPassiveStatus()
type SessionList ¶ added in v0.10.1
type TaggedModelField ¶
type TaggedModelField struct {
FieldName string
Field reflect.Value
Readonly bool
Private bool
Immutable bool
Default interface{}
StoreAsJSONIn *reflect.Value
ForeignKeyOf *BelongsToField
}
TaggedModelField holds all the information extracted from "sg" tags defined on a model's field.
func TaggedModelFieldsOf ¶
func TaggedModelFieldsOf(r Model) (taggedFields []*TaggedModelField)
TaggedModelFieldsOf takes a Model and returns every *TaggedModelField defined (fields are gathered recursively).
type User ¶
type User struct {
BaseModel
Username string `json:"username" validate:"nonzero,max=24,regexp=^[A-Za-z0-9_-]+$" gorm:"not null;unique_index"`
Password string `json:"password,omitempty" validate:"nonzero,min=8,max=32" gorm:"-" sg:"private"`
Role string `json:"role" validate:"nonzero" gorm:"not null" sg:"default=user"`
EncryptedPassword []byte `json:"-" gorm:"not null"`
APIToken string `json:"api_token" gorm:"not null;index" sg:"readonly"`
}
func (*User) BeforeCreate ¶
func (*User) BeforeSave ¶
func (*User) GenerateAPIToken ¶
func (m *User) GenerateAPIToken()