1 // Package rancher wraps Rancher commands necessary for K8s inspection.
16 cmdHostsParams = "--quiet"
19 cmdDockerCmdPsParams = "--no-trunc"
20 cmdDockerCmdPsFilter = "--filter"
21 cmdDockerCmdPsFilterArgs = "label=io.rancher.stack_service.name="
22 cmdDockerCmdPsFormat = "--format"
23 cmdDockerCmdPsFormatArgs = "{{.Command}}"
26 // Rancher implements Informer interface.
31 // GetAPIParams returns parameters of running Kubernetes API server.
32 // It queries default environment set in configuration file.
33 func (r *Rancher) GetAPIParams() ([]string, error) {
34 return getProcessParams(check.APIProcess, check.APIService)
37 func getProcessParams(process check.Command, service check.Service) ([]string, error) {
38 hosts, err := listHosts()
40 return []string{}, err
43 for _, host := range hosts {
44 cmd, err := getPsCmdOutput(host, service)
46 return []string{}, err
50 i := bytes.Index(cmd, []byte(process.String()))
52 return []string{}, fmt.Errorf("missing %s command", process)
54 return btos(cmd[i+len(process.String()):]), nil
57 return []string{}, nil
60 // listHosts lists IDs of active hosts.
61 // It queries default environment set in configuration file.
62 func listHosts() ([]string, error) {
63 cmd := exec.Command(bin, cmdHosts, cmdHostsParams)
64 out, err := cmd.Output()
71 // getPsCmdOutput returns running Kubernetes service command with its parameters.
72 // It queries default environment set in configuration file.
73 func getPsCmdOutput(host string, service check.Service) ([]byte, error) {
74 // Following is equivalent to:
75 // $ rancher --host $HOST \
76 // docker ps --no-trunc \
77 // --filter "label=io.rancher.stack_service.name=$SERVICE" \
78 // --format "{{.Command}}"
79 cmd := exec.Command(bin, paramHost, host,
80 cmdDocker, cmdDockerCmdPs, cmdDockerCmdPsParams,
81 cmdDockerCmdPsFilter, cmdDockerCmdPsFilterArgs+service.String(),
82 cmdDockerCmdPsFormat, cmdDockerCmdPsFormatArgs)
83 out, err := cmd.Output()
90 // btos converts slice of bytes to slice of strings split by white space characters.
91 func btos(in []byte) []string {
93 for _, b := range bytes.Fields(in) {
94 out = append(out, string(b))