@@ -4,15 +4,63 @@ import { knative } from "~/lib/k8s";
44import { EnvVarsInput } from "../EnvVarsInput" ;
55import { ScalingInput } from "../ScalingInput" ;
66import { ResourcesInput } from "../ResourcesInput" ;
7- import { getUser } from "~/lib/auth" ;
7+ import { getUser , getAccount } from "~/lib/auth" ;
88import type { Service } from "~/lib/knative" ;
99import { toNumber } from "~/lib/knative" ;
10+ import { SourceInput } from "./service/SourceInput" ;
11+ import { k8sCore } from "~/lib/k8s" ;
12+
13+ const ensureGithubPullSecret = async ( namespace : string ) => {
14+ "use server" ;
15+ const secretName = "pull-secret-ghcr" ;
16+ try {
17+ await k8sCore . readNamespacedSecret ( secretName , namespace ) ;
18+ } catch ( e ) {
19+ const user = await getUser ( ) ;
20+ const accout = await getAccount ( ) ;
21+
22+ const username = user . name ;
23+ const token = accout . access_token ;
24+ const email = user . email ;
25+
26+ await k8sCore . createNamespacedSecret ( namespace , {
27+ apiVersion : "v1" ,
28+ kind : "Secret" ,
29+ metadata : {
30+ name : secretName ,
31+ labels : {
32+ "app.kubernetes.io/managed-by" : "deploycat" ,
33+ } ,
34+ } ,
35+ type : "kubernetes.io/dockerconfigjson" ,
36+ data : {
37+ ".dockerconfigjson" : Buffer . from (
38+ JSON . stringify ( {
39+ auths : {
40+ "ghcr.io" : {
41+ username : username ,
42+ password : token ,
43+ email : email ,
44+ auth : Buffer . from ( `${ username } :${ token } ` ) . toString ( "base64" ) ,
45+ } ,
46+ } ,
47+ } )
48+ ) . toString ( "base64" ) ,
49+ } ,
50+ } ) ;
51+ }
52+ } ;
1053
1154const createServiceFromForm = async ( form : FormData ) => {
1255 "use server" ;
1356 const service = {
1457 name : form . get ( "name" ) as string ,
58+ source : form . get ( "source" ) as string ,
1559 image : form . get ( "image" ) as string ,
60+ ghPackage : form . get ( "ghPackage" ) as string ,
61+ ghPackageTag : form . get ( "ghPackageTag" ) as string ,
62+ ghPackageName : form . get ( "ghPackageName" ) as string ,
63+ ghPackageOwner : form . get ( "ghPackageOwner" ) as string ,
1664 port : Number ( form . get ( "port" ) ) as number ,
1765 resources : {
1866 cpuLimit : toNumber ( form . get ( "cpuLimit" ) ) ,
@@ -25,7 +73,20 @@ const createServiceFromForm = async (form: FormData) => {
2573 envVars : JSON . parse ( form . get ( "env" ) as string ) as { [ key : string ] : string } ,
2674 } as Service ;
2775 const user = await getUser ( ) ;
28- await knative . createService ( service , user . name ) ;
76+ if ( service ?. source === "ghcr" ) {
77+ try {
78+ await ensureGithubPullSecret ( user . name ) ;
79+ } catch ( e ) {
80+ console . error ( e ) ;
81+ }
82+ service . image = `ghcr.io/${ service . ghPackageOwner } /${ service . ghPackageName } :${ service . ghPackageTag } ` ;
83+ service . pullSecret = "pull-secret-ghcr" ;
84+ }
85+ try {
86+ await knative . createService ( service , user . name ) ;
87+ } catch ( e ) {
88+ console . error ( e ) ;
89+ }
2990} ;
3091
3192const createServiceAction = action ( createServiceFromForm , "createService" ) ;
@@ -54,18 +115,8 @@ export const CreateServiceForm = () => {
54115 class = "input input-bordered w-full"
55116 />
56117 </ label >
57- < label class = "form-control w-full" >
58- < div class = "label" >
59- < span class = "label-text" > Image</ span >
60- </ div >
61- < input
62- type = "text"
63- name = "image"
64- required
65- placeholder = "traefik/whoami"
66- class = "input input-bordered w-full"
67- />
68- </ label >
118+ < SourceInput />
119+
69120 < label class = "form-control w-full" >
70121 < div class = "label" >
71122 < span class = "label-text" > Port</ span >
0 commit comments