Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rebuild applications deployed from local source code #19

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
160 changes: 160 additions & 0 deletions client/api_apps.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ type AppsAPI interface {
DeleteAppByUser(ctx _context.Context, app string) (InlineResponse2002, *_nethttp.Response, error)
FetchAppByUser(ctx _context.Context, app string) (InlineResponse2003, *_nethttp.Response, error)
FetchAppsByUser(ctx _context.Context) (InlineResponse2003, *_nethttp.Response, error)
FetchAppRemote(ctx _context.Context, app string) (InlineResponse2008, *_nethttp.Response, error)
FetchPAT(ctx _context.Context, publickey EncryptKey) (InlineResponse2009, *_nethttp.Response, error)
}

// AppsAPIService AppsAPI service
Expand Down Expand Up @@ -170,6 +172,10 @@ func (a *AppsAPIService) CreateRepository(ctx _context.Context, repositoryDetail
return localVarReturnValue, localVarHTTPResponse, err
}
localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
if err != nil {
return localVarReturnValue, localVarHTTPResponse, err
}

err = localVarHTTPResponse.Body.Close()
if err != nil {
return localVarReturnValue, localVarHTTPResponse, err
Expand All @@ -196,6 +202,160 @@ func (a *AppsAPIService) CreateRepository(ctx _context.Context, repositoryDetail

}

/*
FetchAppRemote Fetch an application's remote
* @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
* @param app The name of the application
@return InlineResponse2008
*/
func (a *AppsAPIService) FetchAppRemote(ctx _context.Context, app string) (InlineResponse2008, *_nethttp.Response, error) {
var (
localVarHTTPMethod = _nethttp.MethodGet
localVarPostBody interface{}
localVarFormFileName string
localVarFileName string
localVarFileBytes []byte
localVarReturnValue InlineResponse2008
)
localVarPath := a.client.cfg.BasePath + "/apps/{app}/remote"
localVarPath = strings.Replace(localVarPath, "{"+"app"+"}", _neturl.QueryEscape(parameterToString(app, "")), -1)

localVarHeaderParams := make(map[string]string)
localVarQueryParams := _neturl.Values{}
localVarFormParams := _neturl.Values{}

// to determine the Content-Type header
localVarHTTPContentTypes := []string{}

// set Content-Type header
localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
if localVarHTTPContentType != "" {
localVarHeaderParams["Content-Type"] = localVarHTTPContentType
}

// to determine the Accept header
localVarHTTPHeaderAccepts := []string{"application/json"}

// set Accept header
localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
if localVarHTTPHeaderAccept != "" {
localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
}
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)

if err != nil {
return localVarReturnValue, nil, err
}

localVarHTTPResponse, err := a.client.CallAPI(r)
if err != nil || localVarHTTPResponse == nil {
return localVarReturnValue, localVarHTTPResponse, err
}

localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
localVarHTTPResponse.Body.Close()
if err != nil {
return localVarReturnValue, localVarHTTPResponse, err
}

if localVarHTTPResponse.StatusCode >= 300 {
newErr := GenericOpenAPIError{
body: localVarBody,
error: fetchError(localVarBody),
}
return localVarReturnValue, localVarHTTPResponse, newErr
}

err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
if err != nil {
newErr := GenericOpenAPIError{
body: localVarBody,
error: err.Error(),
}
return localVarReturnValue, localVarHTTPResponse, newErr
}

return localVarReturnValue, localVarHTTPResponse, nil
}

/*
FetchPAT Fetches PAT for the user to push local source code
* @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
* @param publickey RSA Public key for encrypting the PAT
@return InlineResponse2009
*/
func (a *AppsAPIService) FetchPAT(ctx _context.Context, publickey EncryptKey) (InlineResponse2009, *_nethttp.Response, error) {
var (
localVarHTTPMethod = _nethttp.MethodPost
localVarPostBody interface{}
localVarFormFileName string
localVarFileName string
localVarFileBytes []byte
localVarReturnValue InlineResponse2009
)
localVarPath := a.client.cfg.BasePath + "/github/token"

localVarHeaderParams := make(map[string]string)
localVarQueryParams := _neturl.Values{}
localVarFormParams := _neturl.Values{}

// to determine the Content-Type header
localVarHTTPContentTypes := []string{}

// set Content-Type header
localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
if localVarHTTPContentType != "" {
localVarHeaderParams["Content-Type"] = localVarHTTPContentType
}

// to determine the Accept header
localVarHTTPHeaderAccepts := []string{"application/json"}

// set Accept header
localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
if localVarHTTPHeaderAccept != "" {
localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
}
// body params
localVarPostBody = &publickey

r, err := a.client.prepareRequest(ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)

if err != nil {
return localVarReturnValue, nil, err
}

localVarHTTPResponse, err := a.client.CallAPI(r)
if err != nil || localVarHTTPResponse == nil {
return localVarReturnValue, localVarHTTPResponse, err
}

localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
localVarHTTPResponse.Body.Close()
if err != nil {
return localVarReturnValue, localVarHTTPResponse, err
}

if localVarHTTPResponse.StatusCode >= 300 {
newErr := GenericOpenAPIError{
body: localVarBody,
error: fetchError(localVarBody),
}
return localVarReturnValue, localVarHTTPResponse, newErr
}

err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
if err != nil {
newErr := GenericOpenAPIError{
body: localVarBody,
error: err.Error(),
}
return localVarReturnValue, localVarHTTPResponse, newErr
}

return localVarReturnValue, localVarHTTPResponse, nil
}

/*
DeleteAppByUser Delete an application owned by a user
* @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
Expand Down
10 changes: 10 additions & 0 deletions client/model_encrypt_key.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package openapi

import (
"crypto/rsa"
)

// EncryptKey struct for EncryptKey
type EncryptKey struct {
PublicKey rsa.PublicKey `json:"public_key"`
}
10 changes: 6 additions & 4 deletions client/model_inline_response_200.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,14 +57,16 @@ type InlineResponse2007 struct {

// InlineResponse2008 struct for InlineResponse2008
type InlineResponse2008 struct {
// Git clone URL of the application
CloneURL string `json:"cloneurl" bson:"cloneurl"`
// Email id of Gasper Github user
GitURL string `json:"giturl" bson:"giturl"`
}

// InlineResponse2009 struct for InlineResponse2009
type InlineResponse2009 struct {
// PAT for pushing code to repository
PAT string `json:"pat" bson:"pat"`
// Username of Gasper Github user
Username string `json:"username" bson:"username"`
// Repository contains the name of the Github repository
Repository string `json:"repository" bson:"repository"`
// Email id of Gasper Github user
Email string `json:"email" bson:"email"`
}
114 changes: 106 additions & 8 deletions cmd/appmaker.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ type AppsAPIService interface {
FetchLogsByUser(ctx _context.Context, app string, localVarOptionals *openapi.FetchLogsByUserOpts) (openapi.InlineResponse2005, *_nethttp.Response, error)
RebuildAppByUser(ctx _context.Context, app string) (openapi.InlineResponse2002, *_nethttp.Response, error)
UpdateAppByUser(ctx _context.Context, app string, application openapi.Application) (openapi.InlineResponse2002, *_nethttp.Response, error)
FetchAppRemote(ctx _context.Context, app string) (openapi.InlineResponse2008, *_nethttp.Response, error)
FetchPAT(ctx _context.Context, publickey openapi.EncryptKey) (openapi.InlineResponse2009, *_nethttp.Response, error)
}

var appName string
Expand All @@ -33,7 +35,8 @@ func init() {
createCmd.AddCommand(LocalAppCmd(appsAPIService))
fetchCmd.AddCommand(FetchAppCmd(appsAPIService))
deleteCmd.AddCommand(DeleteAppCmd(appsAPIService))
rootCmd.AddCommand(RebuildAppCmd(appsAPIService))
rebuildCmd.AddCommand(RebuildAppCmd(appsAPIService))
rebuildCmd.AddCommand(RebuildLocalCmd(appsAPIService))
updateCmd.AddCommand(UpdateAppCmd(appsAPIService))
fetchCmd.AddCommand(FetchLogsCmd(appsAPIService))
}
Expand Down Expand Up @@ -136,15 +139,37 @@ func LocalAppCmd(appsAPIservice AppsAPIService) *cobra.Command {
repo, _, err := appsAPIservice.CreateRepository(auth, repositoryDetails)
if err != nil {
cmd.PrintErr("Error creating Github Repository")
return
}

privateKey, err := middlewares.GenerateKeyPair()
if err != nil {
cmd.PrintErr(err, "\nError generating key pair")
return
}

publicKey := openapi.EncryptKey{
PublicKey: privateKey.PublicKey,
}

err = middlewares.GitPush(pathToApplication, repo.CloneURL, repo.PAT, repo.Email, repo.Username)
creds, _, err := appsAPIservice.FetchPAT(auth, publicKey)
if err != nil {
cmd.PrintErr("Error pushing local files to GitHub repository")
cmd.PrintErr(err, "\nError fetching pushing credentials")
return
}

token, err := middlewares.Decrypt(creds.PAT, *privateKey)
if err != nil {
cmd.PrintErr(err, "\nError decrypting PAT")
return
}
err = middlewares.GitPush(pathToApplication, repo.GitURL, token, creds.Email, creds.Username, false)
if err != nil {
cmd.PrintErr(err, "\nError pushing local files to GitHub repository")
return
} else {
privateRepoCloneURL := "https://" + repo.PAT + "@github.com/" + repo.Username + "/" + repo.Repository + ".git"
application.Git.RepoUrl = privateRepoCloneURL
application.Git.AccessToken = repo.PAT
application.Git.RepoUrl = repo.GitURL
application.Git.AccessToken = token
application.Git.Branch = "master"
auth = context.WithValue(context.Background(), openapi.ContextAccessToken, gctltoken)
res, _, err := appsAPIService.CreateApp(auth, language, application)
Expand Down Expand Up @@ -269,7 +294,7 @@ func DeleteAppCmd(appsAPIService AppsAPIService) *cobra.Command {
//RebuildAppCmd returns a command to rebuild an app
func RebuildAppCmd(appsAPIService AppsAPIService) *cobra.Command {
var rebuildAppCmd = &cobra.Command{
Use: "rebuild [APP_NAME]",
Use: "app [APP_NAME]",
Short: "rebuild an app",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
Expand All @@ -282,7 +307,6 @@ func RebuildAppCmd(appsAPIService AppsAPIService) *cobra.Command {
return
}
}

appName := args[0]
auth := context.WithValue(context.Background(), openapi.ContextAccessToken, gctltoken)
res, _, err := appsAPIService.RebuildAppByUser(auth, appName)
Expand All @@ -297,6 +321,80 @@ func RebuildAppCmd(appsAPIService AppsAPIService) *cobra.Command {
return rebuildAppCmd
}

//RebuildLocalCmd returns a command to rebuild an application deployed from local source code
func RebuildLocalCmd(appsAPIService AppsAPIService) *cobra.Command {
var rebuildLocalCmd = &cobra.Command{
Use: "local [APP_NAME] [FILE_PATH]",
Short: "rebuild an app deployed from local source code",
Args: cobra.ExactArgs(2),
Run: func(cmd *cobra.Command, args []string) {
var err error
if gctltoken == "" {
gctltoken, err = middlewares.SetToken(client)
if err != nil {
cmd.Print(err)
return
}
}
appName, pathToApplication := args[0], args[1]

auth := context.WithValue(context.Background(), openapi.ContextAccessToken, gctltoken)

if appName != "" {
res, _, err := appsAPIService.FetchAppRemote(auth, appName)
if err != nil {
cmd.Println(err)
return
}
localRepoRemote, err := middlewares.GitRemote(pathToApplication)
if err != nil {
cmd.Println(err)
return
}
if res.GitURL == localRepoRemote {
privateKey, err := middlewares.GenerateKeyPair()
if err != nil {
cmd.PrintErr(err, "\nError generating key pair")
return
}

publicKey := openapi.EncryptKey{
PublicKey: privateKey.PublicKey,
}

creds, _, err := appsAPIService.FetchPAT(auth, publicKey)
if err != nil {
cmd.PrintErr(err, "\nError fetching pushing credentials")
return
}

token, err := middlewares.Decrypt(creds.PAT, *privateKey)
if err != nil {
cmd.PrintErr(err, "\nError decrypting PAT")
return
}

err = middlewares.GitPush(pathToApplication, localRepoRemote, token, creds.Email, creds.Username, true)
if err != nil {
cmd.PrintErr(err)
return
}
_ , _, err = appsAPIService.RebuildAppByUser(auth, appName)
if err == nil {
cmd.Println("App rebuilt successfully")
return
} else {
cmd.Println(err)
return
}
}
}
},
}
return rebuildLocalCmd
}


//UpdateAppCmd returns a command to update an app
func UpdateAppCmd(appsAPIService AppsAPIService) *cobra.Command {
var updateAppCmd = &cobra.Command{
Expand Down
6 changes: 6 additions & 0 deletions cmd/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ func init() {
rootCmd.AddCommand(deleteCmd)
rootCmd.AddCommand(fetchCmd)
rootCmd.AddCommand(updateCmd)
rootCmd.AddCommand(rebuildCmd)
}

var createCmd = &cobra.Command{
Expand Down Expand Up @@ -42,3 +43,8 @@ var versionCmd = &cobra.Command{
Short: "Print the version number of Gasper",
//TODO RUN
}

var rebuildCmd = &cobra.Command{
Use: "rebuild",
Short: "Rebuild an application",
}
Loading