Skip to content

Commit fdac4d4

Browse files
authored
Merge pull request #16 from gabemontero/http-endpoint-for-import
RHDHPAI-575: model catalog bridge POC
2 parents 64c8ceb + d967002 commit fdac4d4

File tree

4,040 files changed

+849568
-103227
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

4,040 files changed

+849568
-103227
lines changed

Dockerfile.location

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
FROM registry.redhat.io/rhel8/go-toolset:1.22.9 as builder
2+
3+
WORKDIR /opt/app-root/src
4+
5+
COPY go.mod go.mod
6+
COPY go.sum go.sum
7+
COPY vendor/ vendor/
8+
COPY cmd/ cmd/
9+
COPY pkg/ pkg/
10+
11+
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -mod=vendor -o location ./cmd/location/...
12+
13+
FROM registry.access.redhat.com/ubi9-minimal:9.1.0
14+
15+
COPY --from=builder /opt/app-root/src/location /usr/local/bin/location
16+
17+
USER 65532:65532
18+
19+
ENTRYPOINT [ "location" ]

Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ ARGS ?=
2222
.PHONY: $(BIN)
2323
$(BIN):
2424
go build $(GO_FLAGS) -o $(BIN) $(CMD)
25+
go build $(GO_FLAGS) -o _output/location ./cmd/location/...
26+
go build $(GO_FLAGS) -o _output/rhoai-normalizer ./cmd/rhoai-normalizer/...
27+
go build $(GO_FLAGS) -o _output/storage-rest ./cmd/storage-rest/...
2528

2629
build: $(BIN)
2730

assets/bridge/configmap.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
apiVersion: v1
2+
binaryData:
3+
mnist_v1: YXBpVmVyc2lvbjogYmFja3N0YWdlLmlvL3YxYWxwaGExCmtpbmQ6IENvbXBvbmVudAptZXRhZGF0YToKICBhbm5vdGF0aW9uczoKICAgIGJhY2tzdGFnZS5pby90ZWNoZG9jcy1yZWY6IC4vCiAgbGlua3M6CiAgLSBpY29uOiBXZWJBc3NldAogICAgdGl0bGU6IEFQSSBVUkwKICAgIHR5cGU6IHdlYnNpdGUKICAgIHVybDogaHR0cHM6Ly9tbmlzdC0xMDAtMjAyNC0xMi0xM3QxOTM5Mjg0NzZ6LWdnbXRlc3QuYXBwcy5nbW9udGVybzQxNS5kZXZjbHVzdGVyLm9wZW5zaGlmdC5jb20KICAtIGljb246IFdlYkFzc2V0CiAgICB0aXRsZTogcHJlZGljdG9yIEZhc3RBUEkgVVJMCiAgICB0eXBlOiB3ZWJzaXRlCiAgICB1cmw6IGh0dHBzOi8vbW5pc3QtMTAwLTIwMjQtMTItMTN0MTkzOTI4NDc2ei1wcmVkaWN0b3ItZ2dtdGVzdC5hcHBzLmdtb250ZXJvNDE1LmRldmNsdXN0ZXIub3BlbnNoaWZ0LmNvbS9kb2NzCiAgLSBpY29uOiBXZWJBc3NldAogICAgdGl0bGU6IHByZWRpY3RvciBtb2RlbCBzZXJ2aW5nIFVSTAogICAgdHlwZTogd2Vic2l0ZQogICAgdXJsOiBodHRwczovL21uaXN0LTEwMC0yMDI0LTEyLTEzdDE5MzkyODQ3NnotcHJlZGljdG9yLWdnbXRlc3QuYXBwcy5nbW9udGVybzQxNS5kZXZjbHVzdGVyLm9wZW5zaGlmdC5jb20KICAtIGljb246IFdlYkFzc2V0CiAgICB0eXBlOiB3ZWJzaXRlCiAgICB1cmw6IGh0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vdGFyaWxhYnMvbW5pc3QvcmVzb2x2ZS92MjAyMzEyMDYxNjMwMjgvbW5pc3Qub25ueAogIG5hbWU6IG1uaXN0CnNwZWM6CiAgZGVwZW5kc09uOgogIC0gcmVzb3VyY2U6MS4wLjAKICAtIGFwaToxLjAuMAogIGxpZmVjeWNsZTogcHJvZAogIG93bmVyOiB1c2VyOmt1YmU6YWRtaW4KICBwcm9maWxlOgogICAgZGlzcGxheU5hbWU6IG1uaXN0CiAgdHlwZTogbW9kZWwtc2VydmVyCi0tLQphcGlWZXJzaW9uOiBiYWNrc3RhZ2UuaW8vdjFhbHBoYTEKa2luZDogUmVzb3VyY2UKbWV0YWRhdGE6CiAgYW5ub3RhdGlvbnM6CiAgICBiYWNrc3RhZ2UuaW8vdGVjaGRvY3MtcmVmOiByZXNvdXJjZS8KICBsaW5rczoKICAtIGljb246IFdlYkFzc2V0CiAgICB0eXBlOiB3ZWJzaXRlCiAgICB1cmw6IGh0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vdGFyaWxhYnMvbW5pc3QvcmVzb2x2ZS92MjAyMzEyMDYxNjMwMjgvbW5pc3Qub25ueAogIG5hbWU6IDEuMC4wCnNwZWM6CiAgZGVwZW5kZW5jeU9mOgogIC0gY29tcG9uZW50Om1uaXN0CiAgbGlmZWN5Y2xlOiBwcm9kCiAgb3duZXI6IHVzZXI6a3ViZTphZG1pbgogIHByb2ZpbGU6CiAgICBkaXNwbGF5TmFtZTogMS4wLjAKICB0eXBlOiBhaS1tb2RlbAotLS0KYXBpVmVyc2lvbjogYmFja3N0YWdlLmlvL3YxYWxwaGExCmtpbmQ6IEFQSQptZXRhZGF0YToKICBhbm5vdGF0aW9uczoKICAgIGJhY2tzdGFnZS5pby90ZWNoZG9jcy1yZWY6IGFwaS8KICBsaW5rczoKICAtIGljb246IFdlYkFzc2V0CiAgICB0aXRsZTogQVBJIFVSTAogICAgdHlwZTogd2Vic2l0ZQogICAgdXJsOiBodHRwczovL21uaXN0LTEwMC0yMDI0LTEyLTEzdDE5MzkyODQ3NnotZ2dtdGVzdC5hcHBzLmdtb250ZXJvNDE1LmRldmNsdXN0ZXIub3BlbnNoaWZ0LmNvbQogIC0gaWNvbjogV2ViQXNzZXQKICAgIHRpdGxlOiBwcmVkaWN0b3IgRmFzdEFQSSBVUkwKICAgIHR5cGU6IHdlYnNpdGUKICAgIHVybDogaHR0cHM6Ly9tbmlzdC0xMDAtMjAyNC0xMi0xM3QxOTM5Mjg0NzZ6LXByZWRpY3Rvci1nZ210ZXN0LmFwcHMuZ21vbnRlcm80MTUuZGV2Y2x1c3Rlci5vcGVuc2hpZnQuY29tL2RvY3MKICAtIGljb246IFdlYkFzc2V0CiAgICB0aXRsZTogcHJlZGljdG9yIG1vZGVsIHNlcnZpbmcgVVJMCiAgICB0eXBlOiB3ZWJzaXRlCiAgICB1cmw6IGh0dHBzOi8vbW5pc3QtMTAwLTIwMjQtMTItMTN0MTkzOTI4NDc2ei1wcmVkaWN0b3ItZ2dtdGVzdC5hcHBzLmdtb250ZXJvNDE1LmRldmNsdXN0ZXIub3BlbnNoaWZ0LmNvbQogIG5hbWU6IG1uaXN0CnNwZWM6CiAgZGVmaW5pdGlvbjogbm8tZGVmaW5pdGlvbi15ZXQKICBkZXBlbmRlbmN5T2Y6CiAgLSBjb21wb25lbnQ6bW5pc3QKICBsaWZlY3ljbGU6IHByb2QKICBvd25lcjogdXNlcjprdWJlOmFkbWluCiAgcHJvZmlsZToKICAgIGRpc3BsYXlOYW1lOiBtbmlzdAogIHR5cGU6IHVua25vd24K
4+
kind: ConfigMap
5+
metadata:
6+
name: bac-import-model

assets/bridge/deployment.yaml

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
apiVersion: apps/v1
2+
kind: Deployment
3+
metadata:
4+
annotations:
5+
deployment.kubernetes.io/revision: "1"
6+
labels:
7+
app.kubernetes.io/name: bac-import-model
8+
name: bac-import-model
9+
spec:
10+
progressDeadlineSeconds: 600
11+
replicas: 1
12+
revisionHistoryLimit: 10
13+
selector:
14+
matchLabels:
15+
app: bac-import-model
16+
strategy:
17+
rollingUpdate:
18+
maxSurge: 25%
19+
maxUnavailable: 25%
20+
type: RollingUpdate
21+
template:
22+
metadata:
23+
labels:
24+
app: bac-import-model
25+
spec:
26+
containers:
27+
- image: quay.io/gabemontero/import-location:latest
28+
imagePullPolicy: Always
29+
name: location
30+
ports:
31+
- containerPort: 8080
32+
name: location
33+
protocol: TCP
34+
resources:
35+
limits:
36+
cpu: "0"
37+
memory: "0"
38+
requests:
39+
cpu: "0"
40+
memory: "0"
41+
securityContext:
42+
readOnlyRootFilesystem: true
43+
terminationMessagePath: /dev/termination-log
44+
terminationMessagePolicy: File
45+
volumeMounts:
46+
- mountPath: /data
47+
name: location
48+
readOnly: true
49+
dnsPolicy: ClusterFirst
50+
restartPolicy: Always
51+
schedulerName: default-scheduler
52+
securityContext:
53+
runAsNonRoot: true
54+
terminationGracePeriodSeconds: 30
55+
volumes:
56+
- configMap:
57+
defaultMode: 420
58+
name: bac-import-model
59+
name: location

assets/bridge/route.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
apiVersion: route.openshift.io/v1
2+
kind: Route
3+
metadata:
4+
name: bac-import-model
5+
spec:
6+
to:
7+
kind: Service
8+
name: bac-import-model
9+
weight: 100
10+
wildcardPolicy: None

assets/bridge/service.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
apiVersion: v1
2+
kind: Service
3+
metadata:
4+
labels:
5+
app: bac-import-model
6+
name: bac-import-model
7+
spec:
8+
ports:
9+
- name: location
10+
port: 8080
11+
protocol: TCP
12+
targetPort: 8080
13+
selector:
14+
app: bac-import-model

cmd/location/main.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package main
2+
3+
import (
4+
goflag "flag"
5+
gin_gonic_http_srv "github.com/redhat-ai-dev/rhdh-ai-catalog-cli/pkg/cmd/server/location/server"
6+
"github.com/redhat-ai-dev/rhdh-ai-catalog-cli/pkg/util"
7+
"io/fs"
8+
"k8s.io/klog/v2"
9+
"os"
10+
"path/filepath"
11+
"strings"
12+
)
13+
14+
func main() {
15+
flagset := goflag.NewFlagSet("location", goflag.ContinueOnError)
16+
klog.InitFlags(flagset)
17+
18+
content := map[string]*gin_gonic_http_srv.ImportLocation{}
19+
err := filepath.Walk("/data", func(path string, info fs.FileInfo, err error) error {
20+
if info == nil {
21+
return nil
22+
}
23+
if strings.Contains(info.Name(), "_") {
24+
c := []byte{}
25+
klog.Infoln("processing configmap file " + info.Name())
26+
if info.IsDir() {
27+
return nil
28+
}
29+
if strings.HasPrefix(info.Name(), "..") {
30+
klog.Infof("skipping file starting with ..: %s", info.Name())
31+
}
32+
fullName := "/data/" + info.Name()
33+
klog.Infof("reading file %s", fullName)
34+
c, err = os.ReadFile(fullName)
35+
if err != nil {
36+
klog.Errorf("%s", err.Error())
37+
klog.Flush()
38+
return err
39+
}
40+
klog.Infof("adding file %s with content len %d to list", info.Name(), len(c))
41+
ic := &gin_gonic_http_srv.ImportLocation{}
42+
content[info.Name()] = ic
43+
}
44+
return nil
45+
})
46+
if err != nil {
47+
klog.Errorf("%s", err.Error())
48+
os.Exit(-1)
49+
}
50+
server := gin_gonic_http_srv.NewImportLocationServer(content)
51+
stopCh := util.SetupSignalHandler()
52+
server.Run(stopCh)
53+
54+
}

cmd/rhoai-normalizer/main.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
rhoai_normalizer "github.com/redhat-ai-dev/rhdh-ai-catalog-cli/pkg/cmd/server/rhoai-normalizer"
6+
7+
"k8s.io/klog/v2"
8+
"sigs.k8s.io/controller-runtime/pkg/log/zap"
9+
10+
_ "net/http/pprof"
11+
"os"
12+
13+
"github.com/go-logr/logr"
14+
ctrl "sigs.k8s.io/controller-runtime"
15+
"sigs.k8s.io/controller-runtime/pkg/healthz"
16+
)
17+
18+
var (
19+
mainLog logr.Logger
20+
)
21+
22+
func main() {
23+
var pprofAddr string
24+
flag.StringVar(&pprofAddr, "pprof-address", "6000", "The address the pprof endpoint binds to.")
25+
26+
opts := zap.Options{}
27+
opts.BindFlags(flag.CommandLine)
28+
klog.InitFlags(flag.CommandLine)
29+
flag.Parse()
30+
31+
/*
32+
FYI tracing set set with this zap argument on the deployment (see https://sdk.operatorframework.io/docs/building-operators/golang/references/logging/)
33+
args:
34+
- -zap-log-level=6
35+
*/
36+
37+
logger := zap.New(zap.UseFlagOptions(&opts))
38+
ctrl.SetLogger(logger)
39+
mainLog = ctrl.Log.WithName("main")
40+
41+
ctx := ctrl.SetupSignalHandler()
42+
restConfig := ctrl.GetConfigOrDie()
43+
restConfig.QPS = 50
44+
restConfig.Burst = 50
45+
var mgr ctrl.Manager
46+
var err error
47+
mopts := ctrl.Options{}
48+
49+
mgr, err = rhoai_normalizer.NewControllerManager(ctx, restConfig, mopts, pprofAddr)
50+
if err != nil {
51+
mainLog.Error(err, "unable to start controller-runtime manager")
52+
os.Exit(1)
53+
}
54+
55+
if err = mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil {
56+
mainLog.Error(err, "unable to set up health check")
57+
os.Exit(1)
58+
}
59+
if err = mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil {
60+
mainLog.Error(err, "unable to set up ready check")
61+
os.Exit(1)
62+
}
63+
64+
mainLog.Info("Starting controller-runtime manager")
65+
66+
if err = mgr.Start(ctx); err != nil {
67+
mainLog.Error(err, "problem running controller-runtime manager")
68+
os.Exit(1)
69+
}
70+
71+
}

cmd/storage-rest/main.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package main
2+
3+
import (
4+
goflag "flag"
5+
"fmt"
6+
"github.com/redhat-ai-dev/rhdh-ai-catalog-cli/pkg/cmd/server/storage"
7+
"github.com/redhat-ai-dev/rhdh-ai-catalog-cli/pkg/config"
8+
"github.com/redhat-ai-dev/rhdh-ai-catalog-cli/pkg/types"
9+
"github.com/redhat-ai-dev/rhdh-ai-catalog-cli/pkg/util"
10+
"k8s.io/klog/v2"
11+
"os"
12+
)
13+
14+
func main() {
15+
flagset := goflag.NewFlagSet("storage-rest", goflag.ContinueOnError)
16+
klog.InitFlags(flagset)
17+
18+
st := os.Getenv("STORAGE_TYPE")
19+
storageType := types.BridgeStorageType(st)
20+
21+
bs := storage.NewBridgeStorage(storageType)
22+
23+
bridgeURL := os.Getenv("BRIDGE_URL")
24+
cfg := &config.Config{}
25+
restCfg, err := util.GetK8sConfig(cfg)
26+
if err != nil {
27+
fmt.Fprintf(os.Stderr, "%s", err.Error())
28+
os.Exit(1)
29+
}
30+
bridgeToken := util.GetCurrentToken(restCfg)
31+
bkstgURL := os.Getenv("BKSTG_URL")
32+
bkstgToken := os.Getenv("RHDH_TOKEN")
33+
34+
server := storage.NewStorageRESTServer(bs, bridgeURL, bridgeToken, bkstgURL, bkstgToken)
35+
stopCh := util.SetupSignalHandler()
36+
server.Run(stopCh)
37+
38+
}

compare.yaml

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
apiVersion: apps/v1
2+
kind: Deployment
3+
metadata:
4+
name: simple-http-app
5+
spec:
6+
replicas: 1
7+
selector:
8+
matchLabels:
9+
app: simple-http-app
10+
template:
11+
metadata:
12+
labels:
13+
app: simple-http-app
14+
spec:
15+
containers:
16+
- name: simple-http
17+
image: nginx:latest
18+
ports:
19+
- containerPort: 80
20+
volumeMounts:
21+
- mountPath: /usr/share/nginx/html
22+
name: web-content
23+
securityContext:
24+
runAsUser: 0
25+
volumes:
26+
- name: web-content
27+
configMap:
28+
name: simple-http-content
29+
30+
---
31+
apiVersion: v1
32+
kind: ConfigMap
33+
metadata:
34+
name: simple-http-content
35+
data:
36+
index.html: |
37+
<!DOCTYPE html>
38+
<html>
39+
<head>
40+
<title>Hello World!</title>
41+
</head>
42+
<body>
43+
<h1>Hello World!</h1>
44+
</body>
45+
</html>
46+
47+
---
48+
apiVersion: v1
49+
kind: Service
50+
metadata:
51+
name: simple-http-service
52+
spec:
53+
selector:
54+
app: simple-http-app
55+
ports:
56+
- port: 80
57+
targetPort: 80
58+
59+
---
60+
apiVersion: route.openshift.io/v1
61+
kind: Route
62+
metadata:
63+
name: simple-http-route
64+
spec:
65+
to:
66+
kind: Service
67+
name: simple-http-service
68+

0 commit comments

Comments
 (0)