Documentation ¶
Index ¶
- Constants
- Variables
- func NewVariableContext(renderer Renderer, cluster cluster.Cluster, job *Job, group *TaskGroup, ...) *variableContext
- type Constraint
- type Constraints
- func (list Constraints) Add(additional Constraints) (Constraints, error)
- func (list Constraints) Contains(attribute string) bool
- func (list Constraints) Len() int
- func (list Constraints) Less(i, j int) bool
- func (list Constraints) Merge(additional Constraints) Constraints
- func (list Constraints) Swap(i, j int)
- func (list Constraints) Validate() error
- type Dependency
- type DependencyList
- type DockerImage
- type EngineType
- type InstanceName
- type Job
- type JobName
- type Link
- type LinkName
- func (ln LinkName) EtcdServiceName() string
- func (ln LinkName) HasInstance() bool
- func (ln LinkName) Instance() (InstanceName, error)
- func (ln LinkName) Job() (JobName, error)
- func (ln LinkName) PrivateDomainName() string
- func (ln LinkName) Resolve(job *Job) (*Task, *Dependency, error)
- func (ln LinkName) String() string
- func (ln LinkName) Task() (TaskName, error)
- func (ln LinkName) TaskGroup() (TaskGroupName, error)
- func (ln LinkName) Validate() error
- func (ln LinkName) WeaveDomainName() string
- type LinkType
- type Links
- type LogDriver
- type Metrics
- type NetworkType
- type ParsedPortMapping
- func (p ParsedPortMapping) HasHostIP() bool
- func (p ParsedPortMapping) HasHostPort() bool
- func (p ParsedPortMapping) IsTCP() bool
- func (p ParsedPortMapping) IsUDP() bool
- func (p ParsedPortMapping) ProtocolString() string
- func (p ParsedPortMapping) String() string
- func (p ParsedPortMapping) Validate() error
- type Port
- type PortMapping
- type PrivateFrontEnd
- type PublicFrontEnd
- type Renderer
- type RestartPolicy
- type Rewrite
- type Secret
- type SecretList
- type Task
- func (t *Task) ContainerName(scalingGroup uint) string
- func (t *Task) FullName() string
- func (t *Task) GroupCount() uint
- func (t *Task) GroupGlobal() bool
- func (t *Task) GroupName() TaskGroupName
- func (t *Task) InstanceSpecificPrivateDomainName(scalingGroup uint) string
- func (t *Task) JobID() string
- func (t *Task) JobName() JobName
- func (t *Task) MarshalJSON() ([]byte, error)
- func (t *Task) MergedConstraints() Constraints
- func (t *Task) PrivateDomainName() string
- func (t *Task) PrivateFrontEndPort(defaultPort int) int
- func (t *Task) PublicFrontEndPort(defaultPort int) int
- func (t *Task) ServiceName() string
- func (t *Task) Task(name TaskName) (*Task, error)
- func (t *Task) TaskGroup(name TaskGroupName) (*TaskGroup, error)
- func (t Task) Validate() error
- func (t *Task) WeaveDomainName() string
- type TaskGroup
- type TaskGroupList
- type TaskGroupName
- type TaskList
- type TaskName
- type TaskType
- type User
- type Volume
- type VolumeList
- type VolumeType
Constants ¶
const ( MetaAttributePrefix = "meta." AttributeNodeID = "node.id" AttributeTaskGroup = "taskgroup" OperatorEqual = "==" OperatorNotEqual = "!=" )
const ( PrivateLoadBalancerPort = 81 PrivateTcpLoadBalancerPort = 82 )
const ( LinkTypeHTTP = LinkType("http") LinkTypeTCP = LinkType("tcp") )
const ( NetworkTypeDefault = NetworkType("default") // Default for engine NetworkTypeHost = NetworkType("host") // Host network NetworkTypeWeave = NetworkType("weave") // Weave network )
const ( // VolumeTypeLocal specifies a volume that is mapped onto file system of container host VolumeTypeLocal = VolumeType("local") // VolumeTypeInstance specifies a volume, managed by j2, that is specific to the task instance VolumeTypeInstance = VolumeType("instance") )
const (
LogDriverNone = LogDriver("none")
)
const (
RestartPolicyAll = RestartPolicy("all")
)
Variables ¶
var ( TaskNotFoundError = errgo.New("task not found") TaskGroupNotFoundError = errgo.New("taskgroup not found") JobNotFoundError = errgo.New("job not found") InvalidNameError = errgo.New("invalid name") ValidationError = errgo.New("validation failed") OptionNotFoundError = errgo.New("option not found") DependencyNotFoundError = errgo.New("dependency not found") )
var ( // https://github.com/docker/docker/blob/6d6dc2c1a1e36a2c3992186664d4513ce28e84ae/registry/registry.go#L27 PatternNamespace = regexp.MustCompile(`^([a-z0-9_]{4,30})$`) PatternImage = regexp.MustCompile(`^([a-z0-9-_.]+)$`) PatternVersion = regexp.MustCompile("^[a-zA-Z0-9-\\._]+$") )
var ( // NOTE: This format description is slightly different from what we parse down there. // The format given here is the one docker documents. But the repository also consist of a // namespace which is more or less always there. Since our business logic requires some checks based on the // namespace, we parse it explicitly. ErrInvalidFormat = errgo.New("Not a valid docker image. Format: [<registry>/]<repository>[:<version>]") )
Functions ¶
Types ¶
type Constraint ¶
type Constraint struct { Attribute string `json:"attribute,omitempty" mapstructure:"attribute,omitempty"` Value string `json:"value,omitempty" mapstructure:"value,omitempty"` Operator string `json:"operator,omitempty" mapstructure:"operator,omitempty"` }
Constraint contains a specification of a scheduling constraint.
func (Constraint) Conflicts ¶
func (c Constraint) Conflicts(other Constraint) bool
Conflicts returns true if the given constraints have the same attribute, but a different value.
func (Constraint) Equals ¶
func (c Constraint) Equals(other Constraint) bool
Equals returns true if the given constraints are exactly the same.
func (Constraint) OperatorEquals ¶
func (c Constraint) OperatorEquals(op string) bool
OperatorEquals returns true if the operator equals the given operator. This method resolves empty operator to OperatorEqual.
func (Constraint) Validate ¶
func (c Constraint) Validate() error
Validate checks the values of the given constraint. If ok, return nil, otherwise returns an error.
type Constraints ¶
type Constraints []Constraint
Constraints is a list of Constraint's
func (Constraints) Add ¶
func (list Constraints) Add(additional Constraints) (Constraints, error)
Add creates a new list of constraints with all constraints in `list` combined with all constraints of `additional`. If attributes exists in both lists, an error is raised.
func (Constraints) Contains ¶
func (list Constraints) Contains(attribute string) bool
Contains returns true if the given list contains a constrains with the given attribute. Otherwise it returns false.
func (Constraints) Len ¶
func (list Constraints) Len() int
Len is the number of elements in the collection.
func (Constraints) Less ¶
func (list Constraints) Less(i, j int) bool
Less reports whether the element with index i should sort before the element with index j.
func (Constraints) Merge ¶
func (list Constraints) Merge(additional Constraints) Constraints
Merge creates a new list of constraints with all constraints in `list` combined with all constraints of `additional`. If attributes exists in both lists, the attribute in `additional` wins.
func (Constraints) Swap ¶
func (list Constraints) Swap(i, j int)
Swap swaps the elements with indexes i and j.
func (Constraints) Validate ¶
func (list Constraints) Validate() error
Validate checks the values of all constraints in the given list. If ok, return nil, otherwise returns an error.
type Dependency ¶
type Dependency struct { Name LinkName `json:"-", mapstructure:"-"` Network NetworkType `json:"network,omitempty" mapstructure:"network,omitempty"` PrivateFrontEnds []PrivateFrontEnd `json:"private-frontends,omitempty"` }
Dependency configures a link to a task in another job.
func (Dependency) PrivateFrontEndPort ¶
func (t Dependency) PrivateFrontEndPort(defaultPort int) int
PrivateFrontEndPort returns the port number of the first private frontend with a non-0 port number.
func (Dependency) Validate ¶
func (t Dependency) Validate() error
type DependencyList ¶
type DependencyList []Dependency
func (DependencyList) Len ¶
func (list DependencyList) Len() int
Len is the number of elements in the collection.
func (DependencyList) Less ¶
func (list DependencyList) Less(i, j int) bool
Less reports whether the element with index i should sort before the element with index j.
func (DependencyList) Swap ¶
func (list DependencyList) Swap(i, j int)
Swap swaps the elements with indexes i and j.
func (DependencyList) Validate ¶
func (l DependencyList) Validate() error
type DockerImage ¶
type DockerImage struct { Registry string // The registry name Namespace string // The namespace Repository string // The repository name Version string // The version part }
func MustParseDockerImage ¶
func MustParseDockerImage(image string) DockerImage
func ParseDockerImage ¶
func ParseDockerImage(image string) (DockerImage, error)
func (DockerImage) DefaultLatestVersion ¶
func (img DockerImage) DefaultLatestVersion() DockerImage
func (DockerImage) MarshalJSON ¶
func (img DockerImage) MarshalJSON() ([]byte, error)
func (DockerImage) String ¶
func (img DockerImage) String() string
Returns all image inforamtion combined: <registry>/<namespace>/<repository>:<version>
func (*DockerImage) UnmarshalJSON ¶
func (img *DockerImage) UnmarshalJSON(data []byte) error
func (DockerImage) Validate ¶
func (img DockerImage) Validate() error
Validate checks that the given docker image is valid. Returns nil if valid, or an error if not valid.
type EngineType ¶
type EngineType string
EngineType is a name of a type of engine to run a task.
func (EngineType) String ¶
func (et EngineType) String() string
String returns a string version of the given value
type InstanceName ¶
type InstanceName string
func (InstanceName) IsEmpty ¶
func (in InstanceName) IsEmpty() bool
IsEmpty returns true if the given instance name is empty, false otherwise.
func (InstanceName) String ¶
func (in InstanceName) String() string
func (InstanceName) Validate ¶
func (in InstanceName) Validate() error
type Job ¶
type Job struct { ID string `json:"id,omitempty"` Name JobName `json:"name"` Groups TaskGroupList `json:"groups"` Constraints Constraints `json:"constraints,omitempty"` Dependencies DependencyList `json:"dependencies,omitempty"` }
func ParseJobFromFile ¶
func ParseJobFromFile(path string, cluster cluster.Cluster, renderer Renderer, options fg.Options, log *logging.Logger, vaultConfig vault.VaultConfig, ghLoginData vault.GithubLoginData) (*Job, error)
ParseJobFromFile reads a job from file
func (*Job) Dependency ¶
func (j *Job) Dependency(name LinkName) (Dependency, error)
Dependency gets a dependency by the given name
type Link ¶
type LinkName ¶
type LinkName string
LinkName is a name of a link consisting of: <job>.<task>[@<instance>] or <job>.<taskgroup>.<task>[@instance]
func NewLinkName ¶
func NewLinkName(jn JobName, tgn TaskGroupName, tn TaskName, in InstanceName) LinkName
NewLinkName assembles a link name from its elements.
func (LinkName) EtcdServiceName ¶
EtcdServiceName returns name of the service as it is used in ETCD.
func (LinkName) HasInstance ¶
HasInstance returns true if there is a specific instance in link name.
func (LinkName) Instance ¶
func (ln LinkName) Instance() (InstanceName, error)
Instance returns the instance part of the link name.
func (LinkName) PrivateDomainName ¶
PrivateDomainName returns the DNS name (in the private namespace) for the given link name.
func (LinkName) Resolve ¶
func (ln LinkName) Resolve(job *Job) (*Task, *Dependency, error)
Resolve tries to find the task that this link refers to in the context of the given job.
func (LinkName) TaskGroup ¶
func (ln LinkName) TaskGroup() (TaskGroupName, error)
TaskGroup returns the taskgroup part of the link name.
func (LinkName) WeaveDomainName ¶
WeaveDomainName returns the DNS name (in the weave namespace) for the given link name.
type LogDriver ¶
type LogDriver string
func (LogDriver) CreateDockerLogArgs ¶
func (lg LogDriver) CreateDockerLogArgs(dockerOptions cluster.DockerOptions) []string
CreateDockerLogArgs creates a series of command line arguments for the given log driver, based on the given cluster.
type Metrics ¶
type Metrics struct { Port int `json:"port,omitempty" mapstructure:"port,omitempty"` Path string `json:"path,omitempty" mapstructure:"path,omitempty"` RulesPath string `json:"rules-path,omitempty" mapstructure:"rules-path,omitempty"` }
Metrics contains a specification of a metrics provides by a task.
type NetworkType ¶
type NetworkType string
NetworkType is a name of a type of network.
func (NetworkType) IsDefault ¶
func (nt NetworkType) IsDefault() bool
func (NetworkType) IsHost ¶
func (nt NetworkType) IsHost() bool
func (NetworkType) IsWeave ¶
func (nt NetworkType) IsWeave() bool
func (NetworkType) String ¶
func (nt NetworkType) String() string
String returns a link name in format <job>.<taskgroup>.<task>
func (NetworkType) Validate ¶
func (nt NetworkType) Validate() error
Validate returns an error if the given network type is invalid. Returns nil on ok.
type ParsedPortMapping ¶
func (ParsedPortMapping) HasHostIP ¶
func (p ParsedPortMapping) HasHostIP() bool
func (ParsedPortMapping) HasHostPort ¶
func (p ParsedPortMapping) HasHostPort() bool
func (ParsedPortMapping) IsTCP ¶
func (p ParsedPortMapping) IsTCP() bool
func (ParsedPortMapping) IsUDP ¶
func (p ParsedPortMapping) IsUDP() bool
func (ParsedPortMapping) ProtocolString ¶
func (p ParsedPortMapping) ProtocolString() string
func (ParsedPortMapping) String ¶
func (p ParsedPortMapping) String() string
func (ParsedPortMapping) Validate ¶
func (p ParsedPortMapping) Validate() error
Validate checks the port mapping for errors
type Port ¶
func (*Port) UnmarshalJSON ¶
type PortMapping ¶
type PortMapping string
func (PortMapping) Parse ¶
func (p PortMapping) Parse() (ParsedPortMapping, error)
Parse parses a given port mapping.
func (PortMapping) String ¶
func (p PortMapping) String() string
type PrivateFrontEnd ¶
type PrivateFrontEnd struct { Port int `json:"port,omitempty" mapstructure:"port,omitempty"` HostPort int `json:"host-port,omitempty" mapstructure:"host-port,omitempty"` Users []User `json:"users,omitempty"` Weight int `json:"weight,omitempty" mapstructure:"weight,omitempty"` Mode string `json:"mode,omitempty" mapstructure:"mode,omitempty"` RegisterInstance bool `json:"register-instance,omitempty" mapstructure:"register-instance,omitempty"` }
PrivateFrontEnd contains a specification of a private HTTP(S) frontend.
func (PrivateFrontEnd) IsTcp ¶
func (f PrivateFrontEnd) IsTcp() bool
func (PrivateFrontEnd) Validate ¶
func (f PrivateFrontEnd) Validate() error
Validate checks the values of the given frontend. If ok, return nil, otherwise returns an error.
type PublicFrontEnd ¶
type PublicFrontEnd struct { Domain string `json:"domain,omitempty" mapstructure:"domain,omitempty"` PathPrefix string `json:"path-prefix,omitempty" mapstructure:"path-prefix,omitempty"` SslCert string `json:"ssl-cert,omitempty" mapstructure:"ssl-cert,omitempty"` Port int `json:"port,omitempty" mapstructure:"port,omitempty"` HostPort int `json:"host-port,omitempty" mapstructure:"host-port,omitempty"` Users []User `json:"users,omitempty"` Mode string `json:"mode,omitempty" mapstructure:"mode,omitempty"` Weight int `json:"weight,omitempty" mapstructure:"weight,omitempty"` }
PublicFrontEnd contains a specification of a publicly visible HTTP(S) frontend.
func (PublicFrontEnd) Validate ¶
func (f PublicFrontEnd) Validate() error
Validate checks the values of the given frontend. If ok, return nil, otherwise returns an error.
type Renderer ¶
type Renderer interface { NormalizeTask(t *Task) error // Expand "${private_ipv4}": ExpandPrivateIPv4() string // Expand "${public_ipv4}": ExpandPublicIPv4() string // Expand "${etcd_endpoints}": ExpandEtcdEndpoints() string // Expand "${etcd_host}": ExpandEtcdHost() string // Expand "${etcd_port}": ExpandEtcdPort() string // Expand "${hostname}": ExpandHostname() string // Expand "${machine_id}": ExpandMachineID() string // Expand "${instance}": ExpandInstance() string // Expand "${kubernetes-namespace}": ExpandKubernetesNamespace() string // Expand "${kubernetes-pod}": ExpandKubernetesPod() string // Does the given task support a DNS name link to the given target? SupportsDNSLinkTo(task *Task, target LinkName) bool // Does the given task support to be linked to itself through a DNS name? TaskAcceptsDNSLink(task *Task) bool // Does the given dependency support to be linked to itself through a DNS name? DependencyAcceptsDNSLink(d Dependency) bool // TaskDNSName returns the DNS name used to reach the given task TaskDNSName(task *Task) string // DependencyDNSName returns the DNS name used to reach the given dependency DependencyDNSName(d Dependency) string // TaskPort returns the port number used to reach the given task's port // Mode can be "http" or "tcp". TaskPort(task *Task, port int, mode string) int // DependencyPort returns the DNS name used to reach the given dependency's port DependencyPort(d Dependency, port int) int }
type RestartPolicy ¶
type RestartPolicy string
RestartPolicy specifies how to restart tasks in a task group.
func (RestartPolicy) IsAll ¶
func (rp RestartPolicy) IsAll() bool
func (RestartPolicy) String ¶
func (rp RestartPolicy) String() string
String returns a restart policy as string
func (RestartPolicy) Validate ¶
func (rp RestartPolicy) Validate() error
Validate checks if a restart policy follows a valid format
type Rewrite ¶
type Rewrite struct { PathPrefix string `json:"path-prefix,omitempty" mapstructure:"path-prefix,omitempty"` RemovePathPrefix string `json:"remove-path-prefix,omitempty" mapstructure:"remove-path-prefix,omitempty"` Domain string `json:"domain,omitempty" mapstructure:"domain,omitempty"` }
func (Rewrite) HasPathPrefixOnly ¶
HasPathPrefixOnly returns true if only `path` has a non-empty value.
type Secret ¶
type Secret struct { Path string `json:"path"` Field string `json:"field,omitempty" mapstructure:"field,omitempty"` Environment string `json:"environment,omitempty" mapstructure:"environment"` File string `json:"file,omitempty" mapstructure:"file"` }
Secret contains a specification of a secret that is to be used by the task.
func (Secret) TargetEnviroment ¶
TargetEnviroment returns true if the target is an environment variable and if so, the name of the variable.
func (Secret) TargetFile ¶
TargetFile returns true if the target is a file and if so, the path of the file.
type SecretList ¶
type SecretList []Secret
func (SecretList) AnyTargetEnviroment ¶
func (list SecretList) AnyTargetEnviroment() bool
AnyTargetEnviroment returns true if at least one of the secrets in the list has an environment variable as target.
func (SecretList) AnyTargetFile ¶
func (list SecretList) AnyTargetFile() bool
AnyTargetFile returns true if at least one of the secrets in the list has a file as target.
func (SecretList) Validate ¶
func (list SecretList) Validate() error
Validate checks the values of the given secret. If ok, return nil, otherwise returns an error.
type Task ¶
type Task taskData
func (*Task) ContainerName ¶
ContainerName returns the name of the docker container used for this task.
func (*Task) GroupCount ¶
GroupCount returns the Count flag of the containing group.
func (*Task) GroupGlobal ¶
GroupGlobal returns true if the Global flag of the containing group is set.
func (*Task) GroupName ¶
func (t *Task) GroupName() TaskGroupName
GroupName returns the name of the group containing this task.
func (*Task) InstanceSpecificPrivateDomainName ¶
InstanceSpecificPrivateDomainName returns the DNS name (in the private namespace) for an instance of the given task.
func (*Task) JobName ¶
JobName returns the name of the job containing the group containing this task.
func (*Task) MarshalJSON ¶
MarshalJSON converts the given task to JSON. It replaces default values with blanks (in the JSON)
func (*Task) MergedConstraints ¶
func (t *Task) MergedConstraints() Constraints
MergedConstraints returns the constraints resulting from merging the job constraints with the group constraints.
func (*Task) PrivateDomainName ¶
PrivateDomainName returns the DNS name (in the private namespace) for the given task.
func (*Task) PrivateFrontEndPort ¶
PrivateFrontEndPort returns the port number of the first private frontend with a non-0 port number.
func (*Task) PublicFrontEndPort ¶
PublicFrontEndPort returns the port number of the first private frontend with a non-0 port number.
func (*Task) ServiceName ¶
ServiceName returns the name used to register this service.
func (*Task) TaskGroup ¶
func (t *Task) TaskGroup(name TaskGroupName) (*TaskGroup, error)
TaskGroup gets a taskgroup by the given name
func (*Task) WeaveDomainName ¶
WeaveDomainName returns the DNS name (in the weave namespace) for the given task.
type TaskGroup ¶
type TaskGroup struct { Name TaskGroupName `json:"name", mapstructure:"-"` Count uint `json:"count"` // Number of instances of this group Global bool `json:"global,omitempty"` // Scheduled on all machines Tasks TaskList `json:"tasks"` Constraints Constraints `json:"constraints,omitempty"` RestartPolicy RestartPolicy `json:"restart,omitempty" mapstructure:"restart,omitempty"` // contains filtered or unexported fields }
TaskGroup is a group of tasks that are scheduled on the same machine. TaskGroups can have multiple instances, specified by `Count`. Multiple instances are scheduled on different machines when possible.
type TaskGroupList ¶
type TaskGroupList []*TaskGroup
func (TaskGroupList) Len ¶
func (l TaskGroupList) Len() int
func (TaskGroupList) Less ¶
func (l TaskGroupList) Less(i, j int) bool
func (TaskGroupList) Swap ¶
func (l TaskGroupList) Swap(i, j int)
type TaskGroupName ¶
type TaskGroupName string
func (TaskGroupName) String ¶
func (tgn TaskGroupName) String() string
func (TaskGroupName) Validate ¶
func (tgn TaskGroupName) Validate() error
type TaskList ¶
type TaskList []*Task
func (TaskList) IndexByName ¶
IndexByName returns the index of the task with given name in the given list. Returns -1 if no such task is found.
type TaskType ¶
type TaskType string
type User ¶
type User struct { Name string `json:"name" mapstructure:"name"` Password string `json:"password" mapstructure:"password"` }
User contains a user name+password who has access to a frontend
type Volume ¶
type Volume struct { Path string `json:"path"` // container path Type VolumeType `json:"type,omitempty" mapstructure:"type,omitempty"` HostPath string `json:"host-path,omitempty" mapstructure:"host-path,omitempty"` Options []string `json:"options,omitempty" mapstructure:"options,omitempty"` MountOptions []string `json:"mount-options,omitempty" mapstructure:"mount-options,omitempty"` }
Volume contains a specification of a volume mounted into the tasks container
func ParseVolume ¶
ParseVolume parses a string into a Volume
func (Volume) IsInstance ¶
IsInstance returns true of the type of the given volume equals "instance"
func (Volume) IsReadOnly ¶
IsReadOnly returns true if the given volume contains the "ro" option.
func (Volume) MarshalJSON ¶
MarshalJSON creates a json representation of a given volume
func (Volume) MountOption ¶
MountOption looks for a mount option with given key and returns its value. Returns OptionNotFoundError if option is not found.
type VolumeList ¶
type VolumeList []Volume
VolumeList is a list of volumes, ordered such that volumes that need a volume unit come first
func (VolumeList) Len ¶
func (l VolumeList) Len() int
Len is the number of elements in the collection.
func (VolumeList) Less ¶
func (l VolumeList) Less(i, j int) bool
Less reports whether the element with index i should sort before the element with index j.
func (VolumeList) Swap ¶
func (l VolumeList) Swap(i, j int)
Swap swaps the elements with indexes i and j.
type VolumeType ¶
type VolumeType string
VolumeType specifies a type of volume
func (VolumeType) String ¶
func (vt VolumeType) String() string
String returns a volume type as string
func (VolumeType) Validate ¶
func (vt VolumeType) Validate() error
Validate checks if a volume type follows a valid format
Source Files ¶
- constraint.go
- dependency.go
- engine_type.go
- error.go
- frontend.go
- functions.go
- image.go
- instance_name.go
- job.go
- link.go
- link_name.go
- link_type.go
- logging.go
- metrics.go
- network_type.go
- parse.go
- port.go
- port_mapping.go
- renderer.go
- restart_policy.go
- rewrite.go
- secret.go
- secret_list.go
- task.go
- task_list.go
- task_name.go
- task_type.go
- taskgroup.go
- variables.go
- volume.go
- volume_list.go