Skip to content

Commit

Permalink
moving port forward to go
Browse files Browse the repository at this point in the history
  • Loading branch information
divolgin committed Aug 24, 2020
1 parent cd02c68 commit 99be988
Show file tree
Hide file tree
Showing 7 changed files with 112 additions and 148 deletions.
11 changes: 2 additions & 9 deletions go.mod
Expand Up @@ -3,13 +3,12 @@ module github.com/replicatedhq/kots
go 1.14

require (
github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774 // indirect
cloud.google.com/go v0.46.2 // indirect
github.com/Masterminds/semver v1.4.2
github.com/Masterminds/semver/v3 v3.1.0
github.com/Masterminds/sprig v2.22.0+incompatible // indirect
github.com/Masterminds/sprig/v3 v3.1.0
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect
github.com/VividCortex/ewma v1.1.1 // indirect
github.com/ahmetalpbalkan/go-cursor v0.0.0-20131010032410-8136607ea412
github.com/aws/aws-sdk-go v1.25.18
github.com/bitly/go-simplejson v0.5.0 // indirect
Expand All @@ -18,14 +17,11 @@ require (
github.com/bugsnag/bugsnag-go v1.5.3 // indirect
github.com/bugsnag/panicwrap v1.2.0 // indirect
github.com/containerd/continuity v0.0.0-20200228182428-0f16d7a0959c // indirect
github.com/containers/image v3.0.2+incompatible // indirect
github.com/containers/image/v5 v5.2.0
github.com/containers/storage v1.16.2 // indirect
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/docker/distribution v2.7.1+incompatible
github.com/docker/go-units v0.4.0
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 // indirect
github.com/etcd-io/bbolt v1.3.3 // indirect
github.com/fatih/color v1.7.0
github.com/garyburd/redigo v1.6.0 // indirect
github.com/ghodss/yaml v1.0.0
Expand All @@ -34,13 +30,11 @@ require (
github.com/google/uuid v1.1.1
github.com/gorilla/handlers v1.4.2 // indirect
github.com/gorilla/mux v1.7.4 // indirect
github.com/gotestyourself/gotestyourself v2.2.0+incompatible // indirect
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
github.com/manifoldco/promptui v0.3.2
github.com/mattn/go-isatty v0.0.9
github.com/mholt/archiver v3.1.1+incompatible
github.com/mtrmac/gpgme v0.1.2 // indirect
github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913 // indirect
github.com/otiai10/copy v1.0.2
github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2
github.com/pkg/errors v0.9.1
Expand All @@ -52,13 +46,12 @@ require (
github.com/stevvooe/resumable v0.0.0-20180830230917-22b14a53ba50 // indirect
github.com/stretchr/testify v1.5.1
github.com/tj/go-spin v1.1.0
github.com/vbauerster/mpb v3.4.0+incompatible // indirect
github.com/vmware-tanzu/velero v1.4.2 // indirect
github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940 // indirect
github.com/yvasiyarov/gorelic v0.0.7 // indirect
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20160601141957-9c099fbc30e9 // indirect
go.undefinedlabs.com/scopeagent v0.1.12
golang.org/x/crypto v0.0.0-20200414173820-0848c9571904
google.golang.org/genproto v0.0.0-20191220175831-5c49e3ecc1c1 // indirect
gopkg.in/yaml.v2 v2.3.0
helm.sh/helm/v3 v3.2.4
k8s.io/api v0.18.3
Expand Down
72 changes: 6 additions & 66 deletions go.sum

Large diffs are not rendered by default.

73 changes: 0 additions & 73 deletions kotsadm/api/src/controllers/kots/KotsAPI.ts
Expand Up @@ -50,79 +50,6 @@ interface UpdateAppBody {

@Controller("/api/v1/kots")
export class KotsAPI {
@Get("/ports")
async kotsPorts(
@Req() request: Request,
@Res() response: Response,
@HeaderParams("Authorization") auth: string,
): Promise<any> {
const session: Session = await request.app.locals.stores.sessionStore.decode(auth);
if (!session || !session.userId) {
response.status(401);
return {};
}

const kotsAppStore: KotsAppStore = request.app.locals.stores.kotsAppStore;

const apps = await kotsAppStore.listInstalledKotsApps();
if (apps.length === 0) {
return [];
}
const app = apps[0];

if (_.isUndefined(app.currentSequence)) {
return [];
}

const appSpec = await kotsAppStore.getAppSpec(app.id, app.currentSequence);
if (!appSpec) {
return [];
}

const parsedKotsAppSpec = await kotsAppStore.getKotsAppSpec(app.id, app.currentSequence);
if (!parsedKotsAppSpec) {
return [];
}

try {
const parsedAppSpec = yaml.safeLoad(appSpec);
if (!parsedAppSpec) {
return [];
}

if (!parsedAppSpec.spec || !parsedAppSpec.spec!.descriptor || !parsedAppSpec.spec!.descriptor!.links) {
return [];
}

const ports: any[] = [];
for (const link of parsedAppSpec.spec.descriptor.links) {
if (parsedKotsAppSpec.ports) {
const mapped = _.find(parsedKotsAppSpec.ports, (port: any) => {
return port.applicationUrl === link.url;
});

if (mapped) {
ports.push(mapped);
} else {
// get list of app port urls
const appPorts: string[] = [];
for (const port of parsedKotsAppSpec.ports) {
if (port && port.applicationUrl) {
appPorts.push(port.applicationUrl)
}
}
console.log(`no match found for link ${link.url} in app ports ${appPorts.join(", ")}`)
}
}
}

return ports;
} catch (err) {
console.log(err);
return [];
}
}

// Downloading apps was moved to the Go API in 1.14.0
// this function is deprecated and will be removed in 1.16.0
@Get("/:slug")
Expand Down
1 change: 1 addition & 0 deletions kotsadm/pkg/apiserver/server.go
Expand Up @@ -66,6 +66,7 @@ func Start() {
r.Path("/api/v1/undeploy/result").Methods("PUT").HandlerFunc(handlers.NodeProxy(upstream))
r.Path("/api/v1/preflight/app/{appSlug}/sequence/{sequence}").Methods("GET").HandlerFunc(handlers.GetPreflightStatus)
r.Path("/api/v1/preflight/app/{appSlug}/sequence/{sequence}").Methods("POST").HandlerFunc(handlers.PostPreflightStatus)
r.Path("/api/v1/kots/ports").Methods("GET").HandlerFunc(handlers.GetApplicationPorts)

// Support Bundles
r.Path("/api/v1/troubleshoot").Methods("OPTIONS", "GET").HandlerFunc(handlers.GetDefaultTroubleshoot)
Expand Down
43 changes: 43 additions & 0 deletions kotsadm/pkg/handlers/ports.go
@@ -0,0 +1,43 @@
package handlers

import (
"net/http"

"github.com/replicatedhq/kots/kotsadm/pkg/logger"
"github.com/replicatedhq/kots/kotsadm/pkg/store"
"github.com/replicatedhq/kots/kotsadm/pkg/version"
versiontypes "github.com/replicatedhq/kots/kotsadm/pkg/version/types"
)

type GetApplicationPortsResponse struct {
Ports []versiontypes.ForwardedPort `json:"ports"`
}

func GetApplicationPorts(w http.ResponseWriter, r *http.Request) {
if err := requireValidKOTSToken(w, r); err != nil {
logger.Error(err)
return
}

apps, err := store.GetStore().ListInstalledApps()
if err != nil {
logger.Error(err)
w.WriteHeader(http.StatusInternalServerError)
return
}

response := GetApplicationPortsResponse{}

for _, app := range apps {
ports, err := version.GetForwardedPortsFromAppSpec(app.ID, app.CurrentSequence)
if err != nil {
logger.Error(err)
w.WriteHeader(http.StatusInternalServerError)
return
}

response.Ports = append(response.Ports, ports...)
}

JSON(w, 200, response)
}
7 changes: 7 additions & 0 deletions kotsadm/pkg/version/types/types.go
Expand Up @@ -18,3 +18,10 @@ type RealizedLink struct {
Title string `json:"title"`
Uri string `json:"uri"`
}

type ForwardedPort struct {
ApplicationURL string `json:"applicationUrl"`
LocalPort int `json:"localPort"`
ServiceName string `json:"serviceName"`
ServicePort int `json:"servicePort"`
}
53 changes: 53 additions & 0 deletions kotsadm/pkg/version/version.go
Expand Up @@ -559,3 +559,56 @@ func GetRealizedLinksFromAppSpec(appID string, sequence int64) ([]types.Realized

return realizedLinks, nil
}

func GetForwardedPortsFromAppSpec(appID string, sequence int64) ([]types.ForwardedPort, error) {
db := persistence.MustGetPGSession()
query := `select app_spec, kots_app_spec from app_version where app_id = $1 and sequence = $2`
row := db.QueryRow(query, appID, sequence)

var appSpecStr sql.NullString
var kotsAppSpecStr sql.NullString
if err := row.Scan(&appSpecStr, &kotsAppSpecStr); err != nil {
if err == sql.ErrNoRows {
return []types.ForwardedPort{}, nil
}
return nil, errors.Wrap(err, "failed to scan")
}

if appSpecStr.String == "" || kotsAppSpecStr.String == "" {
return []types.ForwardedPort{}, nil
}

decode := scheme.Codecs.UniversalDeserializer().Decode
obj, _, err := decode([]byte(appSpecStr.String), nil, nil)
if err != nil {
return nil, errors.Wrap(err, "failed to decode app spec yaml")
}
appSpec := obj.(*applicationv1beta1.Application)

obj, _, err = decode([]byte(kotsAppSpecStr.String), nil, nil)
if err != nil {
return nil, errors.Wrap(err, "failed to decode kots app spec yaml")
}
kotsAppSpec := obj.(*kotsv1beta1.Application)

if len(kotsAppSpec.Spec.ApplicationPorts) == 0 {
return []types.ForwardedPort{}, nil
}

ports := []types.ForwardedPort{}
for _, link := range appSpec.Spec.Descriptor.Links {
for _, port := range kotsAppSpec.Spec.ApplicationPorts {
if port.ApplicationURL == link.URL {
ports = append(ports, types.ForwardedPort{
ServiceName: port.ServiceName,
ServicePort: port.ServicePort,
LocalPort: port.LocalPort,
ApplicationURL: port.ApplicationURL,
})
}

}
}

return ports, nil
}

0 comments on commit 99be988

Please sign in to comment.