github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/topgun/fly.go (about)

     1  package topgun
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"io"
     7  	"io/ioutil"
     8  	"net/http"
     9  	"time"
    10  
    11  	"github.com/onsi/gomega/gexec"
    12  	"golang.org/x/oauth2"
    13  
    14  	. "github.com/onsi/gomega"
    15  )
    16  
    17  type FlyCli struct {
    18  	Bin    string
    19  	Target string
    20  	Home   string
    21  }
    22  
    23  type Container struct {
    24  	Type  string `json:"type"`
    25  	State string `json:"state"`
    26  	Id    string `json:"id"`
    27  }
    28  
    29  type Worker struct {
    30  	Name            string `json:"name"`
    31  	State           string `json:"state"`
    32  	GardenAddress   string `json:"addr"`
    33  	BaggageclaimUrl string `json:"baggageclaim_url"`
    34  	Team            string `json:"team"`
    35  }
    36  
    37  type Pipeline struct {
    38  	ID       int    `json:"id"`
    39  	Name     string `json:"name"`
    40  	Paused   bool   `json:"paused"`
    41  	Public   bool   `json:"public"`
    42  	TeamName string `json:"team_name"`
    43  }
    44  
    45  type Version struct {
    46  	ID      int               `json:"id"`
    47  	Version map[string]string `json:"version"`
    48  	Enabled bool              `json:"enabled"`
    49  }
    50  
    51  func (f *FlyCli) Login(user, password, endpoint string, loginArgs ...string) {
    52  	Eventually(func() *gexec.Session {
    53  		sess := f.Start(
    54  			append([]string{"login",
    55  				"-c", endpoint,
    56  				"-u", user,
    57  				"-p", password},
    58  				loginArgs...)...,
    59  		)
    60  
    61  		<-sess.Exited
    62  		return sess
    63  	}, 2*time.Minute, 10*time.Second).
    64  		Should(gexec.Exit(0), "Fly should have been able to log in")
    65  }
    66  
    67  func (f *FlyCli) Run(argv ...string) {
    68  	Wait(f.Start(argv...))
    69  }
    70  
    71  func (f *FlyCli) Start(argv ...string) *gexec.Session {
    72  	return Start([]string{"HOME=" + f.Home}, f.Bin, append([]string{"-t", f.Target}, argv...)...)
    73  }
    74  
    75  func (f *FlyCli) StartWithEnv(env []string, argv ...string) *gexec.Session {
    76  	return Start(append([]string{"HOME=" + f.Home}, env...), f.Bin, append([]string{"-t", f.Target}, argv...)...)
    77  }
    78  
    79  func (f *FlyCli) SpawnInteractive(stdin io.Reader, argv ...string) *gexec.Session {
    80  	return SpawnInteractive(stdin, []string{"HOME=" + f.Home}, f.Bin, append([]string{"-t", f.Target}, argv...)...)
    81  }
    82  
    83  func (f *FlyCli) GetContainers() []Container {
    84  	var containers = []Container{}
    85  
    86  	sess := f.Start("containers", "--json")
    87  	<-sess.Exited
    88  	Expect(sess.ExitCode()).To(BeZero())
    89  
    90  	err := json.Unmarshal(sess.Out.Contents(), &containers)
    91  	Expect(err).ToNot(HaveOccurred())
    92  
    93  	return containers
    94  }
    95  
    96  func (f *FlyCli) GetWorkers() []Worker {
    97  	var workers = []Worker{}
    98  
    99  	sess := f.Start("workers", "--json")
   100  	<-sess.Exited
   101  	Expect(sess.ExitCode()).To(BeZero())
   102  
   103  	err := json.Unmarshal(sess.Out.Contents(), &workers)
   104  	Expect(err).ToNot(HaveOccurred())
   105  
   106  	return workers
   107  }
   108  
   109  func (f *FlyCli) GetPipelines() []Pipeline {
   110  	var pipelines = []Pipeline{}
   111  
   112  	sess := f.Start("pipelines", "--json")
   113  	<-sess.Exited
   114  	Expect(sess.ExitCode()).To(BeZero())
   115  
   116  	err := json.Unmarshal(sess.Out.Contents(), &pipelines)
   117  	Expect(err).ToNot(HaveOccurred())
   118  
   119  	return pipelines
   120  }
   121  
   122  func (f *FlyCli) GetVersions(pipeline string, resource string) []Version {
   123  	var versions = []Version{}
   124  
   125  	sess := f.Start("resource-versions", "-r", pipeline+"/"+resource, "--json")
   126  	<-sess.Exited
   127  	Expect(sess.ExitCode()).To(BeZero())
   128  
   129  	err := json.Unmarshal(sess.Out.Contents(), &versions)
   130  	Expect(err).ToNot(HaveOccurred())
   131  
   132  	return versions
   133  }
   134  
   135  func (f *FlyCli) GetUserRole(teamName string) []string {
   136  
   137  	type RoleInfo struct {
   138  		Teams map[string][]string `json:"teams"`
   139  	}
   140  	var teamsInfo RoleInfo = RoleInfo{}
   141  
   142  	sess := f.Start("userinfo", "--json")
   143  	<-sess.Exited
   144  	Expect(sess.ExitCode()).To(BeZero())
   145  
   146  	err := json.Unmarshal(sess.Out.Contents(), &teamsInfo)
   147  	Expect(err).ToNot(HaveOccurred())
   148  
   149  	return teamsInfo.Teams[teamName]
   150  
   151  }
   152  
   153  func BuildBinary() string {
   154  	flyBinPath, err := gexec.Build("github.com/pf-qiu/concourse/v6/fly")
   155  	Expect(err).ToNot(HaveOccurred())
   156  
   157  	return flyBinPath
   158  }
   159  
   160  func RequestCredsInfo(webUrl, token string) ([]byte, error) {
   161  	request, err := http.NewRequest("GET", webUrl+"/api/v1/info/creds", nil)
   162  	Expect(err).ToNot(HaveOccurred())
   163  
   164  	reqHeader := http.Header{}
   165  	reqHeader.Set("Authorization", "Bearer "+token)
   166  
   167  	request.Header = reqHeader
   168  
   169  	client := &http.Client{}
   170  	resp, err := client.Do(request)
   171  	Expect(err).NotTo(HaveOccurred())
   172  	Expect(resp.StatusCode).To(Equal(200))
   173  
   174  	body, err := ioutil.ReadAll(resp.Body)
   175  	Expect(err).NotTo(HaveOccurred())
   176  
   177  	return body, err
   178  }
   179  
   180  func FetchToken(webURL, username, password string) (*oauth2.Token, error) {
   181  	oauth2Config := oauth2.Config{
   182  		ClientID:     "fly",
   183  		ClientSecret: "Zmx5",
   184  		Endpoint:     oauth2.Endpoint{TokenURL: webURL + "/sky/issuer/token"},
   185  		Scopes:       []string{"openid", "profile", "email", "federated:id"},
   186  	}
   187  
   188  	token, err := oauth2Config.PasswordCredentialsToken(context.Background(), username, password)
   189  	if err != nil {
   190  		return nil, err
   191  	}
   192  
   193  	return token, nil
   194  }