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 }