mirror of
https://github.com/GlueOps/autoglue.git
synced 2026-02-14 21:30:05 +01:00
Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1dbdd04808 | ||
|
|
45b55015ac | ||
|
|
6b191089a5 | ||
|
|
d2e6ff9812 | ||
|
|
98a6cf7e51 | ||
|
|
fb4af74e3c | ||
|
|
1021e06655 | ||
|
|
c6be7bf8eb | ||
|
|
1429c40b2b | ||
|
|
73c4904a42 | ||
|
|
40df22c166 | ||
|
|
500a8d1095 | ||
|
|
eff69ff4ce | ||
|
|
2cd6ee91eb |
41
cmd/serve.go
41
cmd/serve.go
@@ -115,6 +115,47 @@ var serveCmd = &cobra.Command{
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("failed to enqueue bootstrap_bastion: %v", err)
|
log.Printf("failed to enqueue bootstrap_bastion: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_, err = jobs.Enqueue(
|
||||||
|
context.Background(),
|
||||||
|
uuid.NewString(),
|
||||||
|
"prepare_cluster",
|
||||||
|
bg.ClusterPrepareArgs{IntervalS: 120},
|
||||||
|
archer.WithMaxRetries(3),
|
||||||
|
archer.WithScheduleTime(time.Now().Add(60*time.Second)),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("failed to enqueue prepare_cluster: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = jobs.Enqueue(
|
||||||
|
context.Background(),
|
||||||
|
uuid.NewString(),
|
||||||
|
"cluster_setup",
|
||||||
|
bg.ClusterSetupArgs{
|
||||||
|
IntervalS: 120,
|
||||||
|
},
|
||||||
|
archer.WithMaxRetries(3),
|
||||||
|
archer.WithScheduleTime(time.Now().Add(60*time.Second)),
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("failed to enqueue cluster setup: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = jobs.Enqueue(
|
||||||
|
context.Background(),
|
||||||
|
uuid.NewString(),
|
||||||
|
"cluster_bootstrap",
|
||||||
|
bg.ClusterBootstrapArgs{
|
||||||
|
IntervalS: 120,
|
||||||
|
},
|
||||||
|
archer.WithMaxRetries(3),
|
||||||
|
archer.WithScheduleTime(time.Now().Add(60*time.Second)),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("failed to enqueue cluster bootstrap: %v", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = auth.Refresh(rt.DB, rt.Cfg.JWTPrivateEncKey)
|
_ = auth.Refresh(rt.DB, rt.Cfg.JWTPrivateEncKey)
|
||||||
|
|||||||
2
go.mod
2
go.mod
@@ -26,7 +26,7 @@ require (
|
|||||||
github.com/spf13/viper v1.21.0
|
github.com/spf13/viper v1.21.0
|
||||||
github.com/swaggo/swag/v2 v2.0.0-rc4
|
github.com/swaggo/swag/v2 v2.0.0-rc4
|
||||||
golang.org/x/crypto v0.45.0
|
golang.org/x/crypto v0.45.0
|
||||||
golang.org/x/oauth2 v0.33.0
|
golang.org/x/oauth2 v0.34.0
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
gorm.io/datatypes v1.2.7
|
gorm.io/datatypes v1.2.7
|
||||||
gorm.io/driver/postgres v1.6.0
|
gorm.io/driver/postgres v1.6.0
|
||||||
|
|||||||
72
go.sum
72
go.sum
@@ -10,62 +10,45 @@ github.com/ScaleFT/sshkeys v0.0.0-20200327173127-6142f742bca5 h1:VauE2GcJNZFun2O
|
|||||||
github.com/ScaleFT/sshkeys v0.0.0-20200327173127-6142f742bca5/go.mod h1:gxOHeajFfvGQh/fxlC8oOKBe23xnnJTif00IFFbiT+o=
|
github.com/ScaleFT/sshkeys v0.0.0-20200327173127-6142f742bca5/go.mod h1:gxOHeajFfvGQh/fxlC8oOKBe23xnnJTif00IFFbiT+o=
|
||||||
github.com/alexedwards/argon2id v1.0.0 h1:wJzDx66hqWX7siL/SRUmgz3F8YMrd/nfX/xHHcQQP0w=
|
github.com/alexedwards/argon2id v1.0.0 h1:wJzDx66hqWX7siL/SRUmgz3F8YMrd/nfX/xHHcQQP0w=
|
||||||
github.com/alexedwards/argon2id v1.0.0/go.mod h1:tYKkqIjzXvZdzPvADMWOEZ+l6+BD6CtBXMj5fnJppiw=
|
github.com/alexedwards/argon2id v1.0.0/go.mod h1:tYKkqIjzXvZdzPvADMWOEZ+l6+BD6CtBXMj5fnJppiw=
|
||||||
github.com/aws/aws-sdk-go-v2 v1.39.6 h1:2JrPCVgWJm7bm83BDwY5z8ietmeJUbh3O2ACnn+Xsqk=
|
github.com/aws/aws-sdk-go-v2 v1.40.1 h1:difXb4maDZkRH0x//Qkwcfpdg1XQVXEAEs2DdXldFFc=
|
||||||
github.com/aws/aws-sdk-go-v2 v1.39.6/go.mod h1:c9pm7VwuW0UPxAEYGyTmyurVcNrbF6Rt/wixFqDhcjE=
|
|
||||||
github.com/aws/aws-sdk-go-v2 v1.40.1/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0=
|
github.com/aws/aws-sdk-go-v2 v1.40.1/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0=
|
||||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.3 h1:DHctwEM8P8iTXFxC/QK0MRjwEpWQeM9yzidCRjldUz0=
|
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4 h1:489krEF9xIGkOaaX3CE/Be2uWjiXrkCH6gUX+bZA/BU=
|
||||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.3/go.mod h1:xdCzcZEtnSTKVDOmUZs4l/j3pSV6rpo1WXl5ugNsL8Y=
|
|
||||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4/go.mod h1:IOAPF6oT9KCsceNTvvYMNHy0+kMF8akOjeDvPENWxp4=
|
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4/go.mod h1:IOAPF6oT9KCsceNTvvYMNHy0+kMF8akOjeDvPENWxp4=
|
||||||
github.com/aws/aws-sdk-go-v2/config v1.31.20 h1:/jWF4Wu90EhKCgjTdy1DGxcbcbNrjfBHvksEL79tfQc=
|
github.com/aws/aws-sdk-go-v2/config v1.32.3 h1:cpz7H2uMNTDa0h/5CYL5dLUEzPSLo2g0NkbxTRJtSSU=
|
||||||
github.com/aws/aws-sdk-go-v2/config v1.31.20/go.mod h1:95Hh1Tc5VYKL9NJ7tAkDcqeKt+MCXQB1hQZaRdJIZE0=
|
|
||||||
github.com/aws/aws-sdk-go-v2/config v1.32.3/go.mod h1:srtPKaJJe3McW6T/+GMBZyIPc+SeqJsNPJsd4mOYZ6s=
|
github.com/aws/aws-sdk-go-v2/config v1.32.3/go.mod h1:srtPKaJJe3McW6T/+GMBZyIPc+SeqJsNPJsd4mOYZ6s=
|
||||||
github.com/aws/aws-sdk-go-v2/credentials v1.18.24 h1:iJ2FmPT35EaIB0+kMa6TnQ+PwG5A1prEdAw+PsMzfHg=
|
github.com/aws/aws-sdk-go-v2/credentials v1.19.3 h1:01Ym72hK43hjwDeJUfi1l2oYLXBAOR8gNSZNmXmvuas=
|
||||||
github.com/aws/aws-sdk-go-v2/credentials v1.18.24/go.mod h1:U91+DrfjAiXPDEGYhh/x29o4p0qHX5HDqG7y5VViv64=
|
|
||||||
github.com/aws/aws-sdk-go-v2/credentials v1.19.3/go.mod h1:55nWF/Sr9Zvls0bGnWkRxUdhzKqj9uRNlPvgV1vgxKc=
|
github.com/aws/aws-sdk-go-v2/credentials v1.19.3/go.mod h1:55nWF/Sr9Zvls0bGnWkRxUdhzKqj9uRNlPvgV1vgxKc=
|
||||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.13 h1:T1brd5dR3/fzNFAQch/iBKeX07/ffu/cLu+q+RuzEWk=
|
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15 h1:utxLraaifrSBkeyII9mIbVwXXWrZdlPO7FIKmyLCEcY=
|
||||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.13/go.mod h1:Peg/GBAQ6JDt+RoBf4meB1wylmAipb7Kg2ZFakZTlwk=
|
|
||||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15/go.mod h1:hW6zjYUDQwfz3icf4g2O41PHi77u10oAzJ84iSzR/lo=
|
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15/go.mod h1:hW6zjYUDQwfz3icf4g2O41PHi77u10oAzJ84iSzR/lo=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13 h1:a+8/MLcWlIxo1lF9xaGt3J/u3yOZx+CdSveSNwjhD40=
|
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15 h1:Y5YXgygXwDI5P4RkteB5yF7v35neH7LfJKBG+hzIons=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13/go.mod h1:oGnKwIYZ4XttyU2JWxFrwvhF6YKiK/9/wmE3v3Iu9K8=
|
|
||||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15/go.mod h1:K+/1EpG42dFSY7CBj+Fruzm8PsCGWTXJ3jdeJ659oGQ=
|
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15/go.mod h1:K+/1EpG42dFSY7CBj+Fruzm8PsCGWTXJ3jdeJ659oGQ=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13 h1:HBSI2kDkMdWz4ZM7FjwE7e/pWDEZ+nR95x8Ztet1ooY=
|
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15 h1:AvltKnW9ewxX2hFmQS0FyJH93aSvJVUEFvXfU+HWtSE=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13/go.mod h1:YE94ZoDArI7awZqJzBAZ3PDD2zSfuP7w6P2knOzIn8M=
|
|
||||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15/go.mod h1:3I4oCdZdmgrREhU74qS1dK9yZ62yumob+58AbFR4cQA=
|
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15/go.mod h1:3I4oCdZdmgrREhU74qS1dK9yZ62yumob+58AbFR4cQA=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk=
|
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc=
|
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.13 h1:eg/WYAa12vqTphzIdWMzqYRVKKnCboVPRlvaybNCqPA=
|
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.15 h1:NLYTEyZmVZo0Qh183sC8nC+ydJXOOeIL/qI/sS3PdLY=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.13/go.mod h1:/FDdxWhz1486obGrKKC1HONd7krpk38LBt+dutLcN9k=
|
|
||||||
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.15/go.mod h1:Z803iB3B0bc8oJV8zH2PERLRfQUJ2n2BXISpsA4+O1M=
|
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.15/go.mod h1:Z803iB3B0bc8oJV8zH2PERLRfQUJ2n2BXISpsA4+O1M=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.3 h1:x2Ibm/Af8Fi+BH+Hsn9TXGdT+hKbDd5XOTZxTMxDk7o=
|
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 h1:0ryTNEdJbzUCEWkVXEXoqlXV72J5keC1GvILMOuD00E=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.3/go.mod h1:IW1jwyrQgMdhisceG8fQLmQIydcT/jWY21rFhzgaKwo=
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4/go.mod h1:HQ4qwNZh32C3CBeO6iJLQlgtMzqeG17ziAA/3KDJFow=
|
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4/go.mod h1:HQ4qwNZh32C3CBeO6iJLQlgtMzqeG17ziAA/3KDJFow=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.4 h1:NvMjwvv8hpGUILarKw7Z4Q0w1H9anXKsesMxtw++MA4=
|
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.6 h1:P1MU/SuhadGvg2jtviDXPEejU3jBNhoeeAlRadHzvHI=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.4/go.mod h1:455WPHSwaGj2waRSpQp7TsnpOnBfw8iDfPfbwl7KPJE=
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.6/go.mod h1:5KYaMG6wmVKMFBSfWoyG/zH8pWwzQFnKgpoSRlXHKdQ=
|
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.6/go.mod h1:5KYaMG6wmVKMFBSfWoyG/zH8pWwzQFnKgpoSRlXHKdQ=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.13 h1:kDqdFvMY4AtKoACfzIGD8A0+hbT41KTKF//gq7jITfM=
|
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15 h1:3/u/4yZOffg5jdNk1sDpOQ4Y+R6Xbh+GzpDrSZjuy3U=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.13/go.mod h1:lmKuogqSU3HzQCwZ9ZtcqOc5XGMqtDK7OIc2+DxiUEg=
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15/go.mod h1:4Zkjq0FKjE78NKjabuM4tRXKFzUJWXgP0ItEZK8l7JU=
|
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15/go.mod h1:4Zkjq0FKjE78NKjabuM4tRXKFzUJWXgP0ItEZK8l7JU=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.13 h1:zhBJXdhWIFZ1acfDYIhu4+LCzdUS2Vbcum7D01dXlHQ=
|
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.15 h1:wsSQ4SVz5YE1crz0Ap7VBZrV4nNqZt4CIBBT8mnwoNc=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.13/go.mod h1:JaaOeCE368qn2Hzi3sEzY6FgAZVCIYcC2nwbro2QCh8=
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.15/go.mod h1:I7sditnFGtYMIqPRU1QoHZAUrXkGp4SczmlLwrNPlD0=
|
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.15/go.mod h1:I7sditnFGtYMIqPRU1QoHZAUrXkGp4SczmlLwrNPlD0=
|
||||||
github.com/aws/aws-sdk-go-v2/service/route53 v1.59.5 h1:4Uy8lhrh4E9jS/MtmzjuEuvX7zOZTbNuPe+zkvtvRRU=
|
github.com/aws/aws-sdk-go-v2/service/route53 v1.61.1 h1:ik9tMw+xWZqzffOtGH3PfV0Yy/V+QsCb1XYXXXjUskk=
|
||||||
github.com/aws/aws-sdk-go-v2/service/route53 v1.59.5/go.mod h1:TUbfYOisWZWyT2qjmlMh93ERw1Ry8G4q/yT2Q8TsDag=
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/route53 v1.61.1/go.mod h1:JRqmldxIPU6uck5bcFS8ExwwG2mUwfy+jiUmismOxJs=
|
github.com/aws/aws-sdk-go-v2/service/route53 v1.61.1/go.mod h1:JRqmldxIPU6uck5bcFS8ExwwG2mUwfy+jiUmismOxJs=
|
||||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.90.2 h1:DhdbtDl4FdNlj31+xiRXANxEE+eC7n8JQz+/ilwQ8Uc=
|
github.com/aws/aws-sdk-go-v2/service/s3 v1.93.0 h1:IrbE3B8O9pm3lsg96AXIN5MXX4pECEuExh/A0Du3AuI=
|
||||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.90.2/go.mod h1:+wArOOrcHUevqdto9k1tKOF5++YTe9JEcPSc9Tx2ZSw=
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.93.0/go.mod h1:/sJLzHtiiZvs6C1RbxS/anSAFwZD6oC6M/kotQzOiLw=
|
github.com/aws/aws-sdk-go-v2/service/s3 v1.93.0/go.mod h1:/sJLzHtiiZvs6C1RbxS/anSAFwZD6oC6M/kotQzOiLw=
|
||||||
|
github.com/aws/aws-sdk-go-v2/service/signin v1.0.3 h1:d/6xOGIllc/XW1lzG9a4AUBMmpLA9PXcQnVPTuHHcik=
|
||||||
github.com/aws/aws-sdk-go-v2/service/signin v1.0.3/go.mod h1:fQ7E7Qj9GiW8y0ClD7cUJk3Bz5Iw8wZkWDHsTe8vDKs=
|
github.com/aws/aws-sdk-go-v2/service/signin v1.0.3/go.mod h1:fQ7E7Qj9GiW8y0ClD7cUJk3Bz5Iw8wZkWDHsTe8vDKs=
|
||||||
github.com/aws/aws-sdk-go-v2/service/sso v1.30.3 h1:NjShtS1t8r5LUfFVtFeI8xLAHQNTa7UI0VawXlrBMFQ=
|
github.com/aws/aws-sdk-go-v2/service/sso v1.30.6 h1:8sTTiw+9yuNXcfWeqKF2x01GqCF49CpP4Z9nKrrk/ts=
|
||||||
github.com/aws/aws-sdk-go-v2/service/sso v1.30.3/go.mod h1:fKvyjJcz63iL/ftA6RaM8sRCtN4r4zl4tjL3qw5ec7k=
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/sso v1.30.6/go.mod h1:8WYg+Y40Sn3X2hioaaWAAIngndR8n1XFdRPPX+7QBaM=
|
github.com/aws/aws-sdk-go-v2/service/sso v1.30.6/go.mod h1:8WYg+Y40Sn3X2hioaaWAAIngndR8n1XFdRPPX+7QBaM=
|
||||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.7 h1:gTsnx0xXNQ6SBbymoDvcoRHL+q4l/dAFsQuKfDWSaGc=
|
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11 h1:E+KqWoVsSrj1tJ6I/fjDIu5xoS2Zacuu1zT+H7KtiIk=
|
||||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.7/go.mod h1:klO+ejMvYsB4QATfEOIXk8WAEwN4N0aBfJpvC+5SZBo=
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11/go.mod h1:qyWHz+4lvkXcr3+PoGlGHEI+3DLLiU6/GdrFfMaAhB0=
|
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11/go.mod h1:qyWHz+4lvkXcr3+PoGlGHEI+3DLLiU6/GdrFfMaAhB0=
|
||||||
github.com/aws/aws-sdk-go-v2/service/sts v1.40.2 h1:HK5ON3KmQV2HcAunnx4sKLB9aPf3gKGwVAf7xnx0QT0=
|
github.com/aws/aws-sdk-go-v2/service/sts v1.41.3 h1:tzMkjh0yTChUqJDgGkcDdxvZDSrJ/WB6R6ymI5ehqJI=
|
||||||
github.com/aws/aws-sdk-go-v2/service/sts v1.40.2/go.mod h1:E19xDjpzPZC7LS2knI9E6BaRFDK43Eul7vd6rSq2HWk=
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/sts v1.41.3/go.mod h1:T270C0R5sZNLbWUe8ueiAF42XSZxxPocTaGSgs5c/60=
|
github.com/aws/aws-sdk-go-v2/service/sts v1.41.3/go.mod h1:T270C0R5sZNLbWUe8ueiAF42XSZxxPocTaGSgs5c/60=
|
||||||
github.com/aws/smithy-go v1.23.2 h1:Crv0eatJUQhaManss33hS5r40CG3ZFH+21XSkqMrIUM=
|
github.com/aws/smithy-go v1.24.0 h1:LpilSUItNPFr1eY85RYgTIg5eIEPtvFbskaFcmmIUnk=
|
||||||
github.com/aws/smithy-go v1.23.2/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0=
|
|
||||||
github.com/aws/smithy-go v1.24.0/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0=
|
github.com/aws/smithy-go v1.24.0/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0=
|
||||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||||
@@ -77,8 +60,7 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF
|
|||||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
|
github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
|
||||||
github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
|
github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
|
||||||
github.com/coreos/go-oidc/v3 v3.16.0 h1:qRQUCFstKpXwmEjDQTIbyY/5jF00+asXzSkmkoa/mow=
|
github.com/coreos/go-oidc/v3 v3.17.0 h1:hWBGaQfbi0iVviX4ibC7bk8OKT5qNr4klBaCHVNvehc=
|
||||||
github.com/coreos/go-oidc/v3 v3.16.0/go.mod h1:wqPbKFrVnE90vty060SB40FCJ8fTHTxSwyXJqZH+sI8=
|
|
||||||
github.com/coreos/go-oidc/v3 v3.17.0/go.mod h1:wqPbKFrVnE90vty060SB40FCJ8fTHTxSwyXJqZH+sI8=
|
github.com/coreos/go-oidc/v3 v3.17.0/go.mod h1:wqPbKFrVnE90vty060SB40FCJ8fTHTxSwyXJqZH+sI8=
|
||||||
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
|
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
|
||||||
@@ -248,8 +230,7 @@ github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDc
|
|||||||
github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik=
|
github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik=
|
||||||
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
|
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
|
||||||
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||||
github.com/sosedoff/pgweb v0.16.2 h1:1F1CWlCLSEgSctMva+nYuUibdhyiCUzlXyU5MQUJbFM=
|
github.com/sosedoff/pgweb v0.17.0 h1:2WSPajNyqStS5oulvfdKIBaWQTy/qNBREBp51h4yiLU=
|
||||||
github.com/sosedoff/pgweb v0.16.2/go.mod h1:ER7fsBddI3h7MQKO5RsUPi7Q/PWZYSKcI61kTp369Rw=
|
|
||||||
github.com/sosedoff/pgweb v0.17.0/go.mod h1:fY82HStJ/n/JCvzHsJmVT6BDYiWxSQG6CvqH+biuUbM=
|
github.com/sosedoff/pgweb v0.17.0/go.mod h1:fY82HStJ/n/JCvzHsJmVT6BDYiWxSQG6CvqH+biuUbM=
|
||||||
github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw=
|
github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw=
|
||||||
github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U=
|
github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U=
|
||||||
@@ -257,8 +238,7 @@ github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I=
|
|||||||
github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg=
|
github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg=
|
||||||
github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY=
|
github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY=
|
||||||
github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
|
github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
|
||||||
github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s=
|
github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=
|
||||||
github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0=
|
|
||||||
github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
|
github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
|
||||||
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
|
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
|
||||||
@@ -310,8 +290,7 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
|
|||||||
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
|
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
|
||||||
golang.org/x/crypto v0.44.0 h1:A97SsFvM3AIwEEmTBiaxPPTYpDC47w720rdiiUvgoAU=
|
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
|
||||||
golang.org/x/crypto v0.44.0/go.mod h1:013i+Nw79BMiQiMsOPcVCB5ZIJbYkerPrGnOa00tvmc=
|
|
||||||
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
|
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
@@ -323,11 +302,12 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
|
|||||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||||
golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=
|
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
|
||||||
golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=
|
|
||||||
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
|
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
|
||||||
golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo=
|
golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo=
|
||||||
golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
|
golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
|
||||||
|
golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw=
|
||||||
|
golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
|||||||
@@ -107,6 +107,28 @@ func NewJobs(gdb *gorm.DB, dbUrl string) (*Jobs, error) {
|
|||||||
archer.WithInstances(1),
|
archer.WithInstances(1),
|
||||||
archer.WithTimeout(2*time.Minute),
|
archer.WithTimeout(2*time.Minute),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
c.Register(
|
||||||
|
"prepare_cluster",
|
||||||
|
ClusterPrepareWorker(gdb, jobs),
|
||||||
|
archer.WithInstances(1),
|
||||||
|
archer.WithTimeout(2*time.Minute),
|
||||||
|
)
|
||||||
|
|
||||||
|
c.Register(
|
||||||
|
"cluster_setup",
|
||||||
|
ClusterSetupWorker(gdb, jobs),
|
||||||
|
archer.WithInstances(1),
|
||||||
|
archer.WithTimeout(2*time.Minute),
|
||||||
|
)
|
||||||
|
|
||||||
|
c.Register(
|
||||||
|
"cluster_bootstrap",
|
||||||
|
ClusterBootstrapWorker(gdb, jobs),
|
||||||
|
archer.WithInstances(1),
|
||||||
|
archer.WithTimeout(60*time.Minute),
|
||||||
|
)
|
||||||
|
|
||||||
return jobs, nil
|
return jobs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
121
internal/bg/cluster_bootstrap.go
Normal file
121
internal/bg/cluster_bootstrap.go
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
package bg
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/dyaksa/archer"
|
||||||
|
"github.com/dyaksa/archer/job"
|
||||||
|
"github.com/glueops/autoglue/internal/models"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"github.com/rs/zerolog/log"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ClusterBootstrapArgs struct {
|
||||||
|
IntervalS int `json:"interval_seconds,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ClusterBootstrapResult struct {
|
||||||
|
Status string `json:"status"`
|
||||||
|
Processed int `json:"processed"`
|
||||||
|
Ready int `json:"ready"`
|
||||||
|
Failed int `json:"failed"`
|
||||||
|
ElapsedMs int `json:"elapsed_ms"`
|
||||||
|
FailedIDs []uuid.UUID `json:"failed_cluster_ids"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func ClusterBootstrapWorker(db *gorm.DB, jobs *Jobs) archer.WorkerFn {
|
||||||
|
return func(ctx context.Context, j job.Job) (any, error) {
|
||||||
|
args := ClusterBootstrapArgs{IntervalS: 120}
|
||||||
|
jobID := j.ID
|
||||||
|
start := time.Now()
|
||||||
|
|
||||||
|
_ = j.ParseArguments(&args)
|
||||||
|
if args.IntervalS <= 0 {
|
||||||
|
args.IntervalS = 120
|
||||||
|
}
|
||||||
|
|
||||||
|
var clusters []models.Cluster
|
||||||
|
if err := db.
|
||||||
|
Preload("BastionServer.SshKey").
|
||||||
|
Where("status = ?", clusterStatusProvisioning).
|
||||||
|
Find(&clusters).Error; err != nil {
|
||||||
|
log.Error().Err(err).Msg("[cluster_bootstrap] query clusters failed")
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
proc, ready, failCount := 0, 0, 0
|
||||||
|
var failedIDs []uuid.UUID
|
||||||
|
|
||||||
|
perClusterTimeout := 60 * time.Minute
|
||||||
|
|
||||||
|
for i := range clusters {
|
||||||
|
c := &clusters[i]
|
||||||
|
proc++
|
||||||
|
|
||||||
|
if c.BastionServer.ID == uuid.Nil || c.BastionServer.Status != "ready" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
logger := log.With().
|
||||||
|
Str("job", jobID).
|
||||||
|
Str("cluster_id", c.ID.String()).
|
||||||
|
Str("cluster_name", c.Name).
|
||||||
|
Logger()
|
||||||
|
|
||||||
|
logger.Info().Msg("[cluster_bootstrap] running make bootstrap")
|
||||||
|
|
||||||
|
runCtx, cancel := context.WithTimeout(ctx, perClusterTimeout)
|
||||||
|
out, err := runMakeOnBastion(runCtx, db, c, "bootstrap")
|
||||||
|
cancel()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
failCount++
|
||||||
|
failedIDs = append(failedIDs, c.ID)
|
||||||
|
logger.Error().Err(err).Str("output", out).Msg("[cluster_bootstrap] make bootstrap failed")
|
||||||
|
_ = setClusterStatus(db, c.ID, clusterStatusFailed, fmt.Sprintf("make bootstrap: %v", err))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// you can choose a different terminal status here if you like
|
||||||
|
if err := setClusterStatus(db, c.ID, clusterStatusReady, ""); err != nil {
|
||||||
|
failCount++
|
||||||
|
failedIDs = append(failedIDs, c.ID)
|
||||||
|
logger.Error().Err(err).Msg("[cluster_bootstrap] failed to mark cluster ready")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
ready++
|
||||||
|
logger.Info().Msg("[cluster_bootstrap] cluster marked ready")
|
||||||
|
}
|
||||||
|
|
||||||
|
res := ClusterBootstrapResult{
|
||||||
|
Status: "ok",
|
||||||
|
Processed: proc,
|
||||||
|
Ready: ready,
|
||||||
|
Failed: failCount,
|
||||||
|
ElapsedMs: int(time.Since(start).Milliseconds()),
|
||||||
|
FailedIDs: failedIDs,
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info().
|
||||||
|
Int("processed", proc).
|
||||||
|
Int("ready", ready).
|
||||||
|
Int("failed", failCount).
|
||||||
|
Msg("[cluster_bootstrap] reconcile tick ok")
|
||||||
|
|
||||||
|
// self-reschedule
|
||||||
|
next := time.Now().Add(time.Duration(args.IntervalS) * time.Second)
|
||||||
|
_, _ = jobs.Enqueue(
|
||||||
|
ctx,
|
||||||
|
uuid.NewString(),
|
||||||
|
"cluster_bootstrap",
|
||||||
|
args,
|
||||||
|
archer.WithScheduleTime(next),
|
||||||
|
archer.WithMaxRetries(1),
|
||||||
|
)
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
120
internal/bg/cluster_setup.go
Normal file
120
internal/bg/cluster_setup.go
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
package bg
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/dyaksa/archer"
|
||||||
|
"github.com/dyaksa/archer/job"
|
||||||
|
"github.com/glueops/autoglue/internal/models"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"github.com/rs/zerolog/log"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ClusterSetupArgs struct {
|
||||||
|
IntervalS int `json:"interval_seconds,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ClusterSetupResult struct {
|
||||||
|
Status string `json:"status"`
|
||||||
|
Processed int `json:"processed"`
|
||||||
|
Provisioning int `json:"provisioning"`
|
||||||
|
Failed int `json:"failed"`
|
||||||
|
ElapsedMs int `json:"elapsed_ms"`
|
||||||
|
FailedCluster []uuid.UUID `json:"failed_cluster_ids"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func ClusterSetupWorker(db *gorm.DB, jobs *Jobs) archer.WorkerFn {
|
||||||
|
return func(ctx context.Context, j job.Job) (any, error) {
|
||||||
|
args := ClusterSetupArgs{IntervalS: 120}
|
||||||
|
jobID := j.ID
|
||||||
|
start := time.Now()
|
||||||
|
|
||||||
|
_ = j.ParseArguments(&args)
|
||||||
|
if args.IntervalS <= 0 {
|
||||||
|
args.IntervalS = 120
|
||||||
|
}
|
||||||
|
|
||||||
|
var clusters []models.Cluster
|
||||||
|
if err := db.
|
||||||
|
Preload("BastionServer.SshKey").
|
||||||
|
Where("status = ?", clusterStatusPending).
|
||||||
|
Find(&clusters).Error; err != nil {
|
||||||
|
log.Error().Err(err).Msg("[cluster_setup] query clusters failed")
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
proc, prov, failCount := 0, 0, 0
|
||||||
|
var failedIDs []uuid.UUID
|
||||||
|
|
||||||
|
perClusterTimeout := 30 * time.Minute
|
||||||
|
|
||||||
|
for i := range clusters {
|
||||||
|
c := &clusters[i]
|
||||||
|
proc++
|
||||||
|
|
||||||
|
if c.BastionServer.ID == uuid.Nil || c.BastionServer.Status != "ready" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
logger := log.With().
|
||||||
|
Str("job", jobID).
|
||||||
|
Str("cluster_id", c.ID.String()).
|
||||||
|
Str("cluster_name", c.Name).
|
||||||
|
Logger()
|
||||||
|
|
||||||
|
logger.Info().Msg("[cluster_setup] running make setup")
|
||||||
|
|
||||||
|
runCtx, cancel := context.WithTimeout(ctx, perClusterTimeout)
|
||||||
|
out, err := runMakeOnBastion(runCtx, db, c, "setup")
|
||||||
|
cancel()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
failCount++
|
||||||
|
failedIDs = append(failedIDs, c.ID)
|
||||||
|
logger.Error().Err(err).Str("output", out).Msg("[cluster_setup] make setup failed")
|
||||||
|
_ = setClusterStatus(db, c.ID, clusterStatusFailed, fmt.Sprintf("make setup: %v", err))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := setClusterStatus(db, c.ID, clusterStatusProvisioning, ""); err != nil {
|
||||||
|
failCount++
|
||||||
|
failedIDs = append(failedIDs, c.ID)
|
||||||
|
logger.Error().Err(err).Msg("[cluster_setup] failed to mark cluster provisioning")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
prov++
|
||||||
|
logger.Info().Msg("[cluster_setup] cluster moved to provisioning")
|
||||||
|
}
|
||||||
|
|
||||||
|
res := ClusterSetupResult{
|
||||||
|
Status: "ok",
|
||||||
|
Processed: proc,
|
||||||
|
Provisioning: prov,
|
||||||
|
Failed: failCount,
|
||||||
|
ElapsedMs: int(time.Since(start).Milliseconds()),
|
||||||
|
FailedCluster: failedIDs,
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info().
|
||||||
|
Int("processed", proc).
|
||||||
|
Int("provisioning", prov).
|
||||||
|
Int("failed", failCount).
|
||||||
|
Msg("[cluster_setup] reconcile tick ok")
|
||||||
|
|
||||||
|
// self-reschedule
|
||||||
|
next := time.Now().Add(time.Duration(args.IntervalS) * time.Second)
|
||||||
|
_, _ = jobs.Enqueue(
|
||||||
|
ctx,
|
||||||
|
uuid.NewString(),
|
||||||
|
"cluster_setup",
|
||||||
|
args,
|
||||||
|
archer.WithScheduleTime(next),
|
||||||
|
archer.WithMaxRetries(1),
|
||||||
|
)
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
510
internal/bg/prepare_cluster.go
Normal file
510
internal/bg/prepare_cluster.go
Normal file
@@ -0,0 +1,510 @@
|
|||||||
|
package bg
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"encoding/base64"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/dyaksa/archer"
|
||||||
|
"github.com/dyaksa/archer/job"
|
||||||
|
"github.com/glueops/autoglue/internal/models"
|
||||||
|
"github.com/glueops/autoglue/internal/utils"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"github.com/rs/zerolog/log"
|
||||||
|
"golang.org/x/crypto/ssh"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ClusterPrepareArgs struct {
|
||||||
|
IntervalS int `json:"interval_seconds,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ClusterPrepareFailure struct {
|
||||||
|
ClusterID uuid.UUID `json:"cluster_id"`
|
||||||
|
Step string `json:"step"`
|
||||||
|
Reason string `json:"reason"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ClusterPrepareResult struct {
|
||||||
|
Status string `json:"status"`
|
||||||
|
Processed int `json:"processed"`
|
||||||
|
MarkedPending int `json:"marked_pending"`
|
||||||
|
Failed int `json:"failed"`
|
||||||
|
ElapsedMs int `json:"elapsed_ms"`
|
||||||
|
FailedIDs []uuid.UUID `json:"failed_cluster_ids"`
|
||||||
|
Failures []ClusterPrepareFailure `json:"failures"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Alias the status constants from models to avoid string drift.
|
||||||
|
const (
|
||||||
|
clusterStatusPrePending = models.ClusterStatusPrePending
|
||||||
|
clusterStatusPending = models.ClusterStatusPending
|
||||||
|
clusterStatusProvisioning = models.ClusterStatusProvisioning
|
||||||
|
clusterStatusReady = models.ClusterStatusReady
|
||||||
|
clusterStatusFailed = models.ClusterStatusFailed
|
||||||
|
)
|
||||||
|
|
||||||
|
func ClusterPrepareWorker(db *gorm.DB, jobs *Jobs) archer.WorkerFn {
|
||||||
|
return func(ctx context.Context, j job.Job) (any, error) {
|
||||||
|
args := ClusterPrepareArgs{IntervalS: 120}
|
||||||
|
jobID := j.ID
|
||||||
|
start := time.Now()
|
||||||
|
|
||||||
|
_ = j.ParseArguments(&args)
|
||||||
|
if args.IntervalS <= 0 {
|
||||||
|
args.IntervalS = 120
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load all clusters that are pre_pending; we’ll filter for bastion.ready in memory.
|
||||||
|
var clusters []models.Cluster
|
||||||
|
if err := db.
|
||||||
|
Preload("BastionServer.SshKey").
|
||||||
|
Preload("CaptainDomain").
|
||||||
|
Preload("ControlPlaneRecordSet").
|
||||||
|
Preload("NodePools.Servers.SshKey").
|
||||||
|
Where("status = ?", clusterStatusPrePending).
|
||||||
|
Find(&clusters).Error; err != nil {
|
||||||
|
log.Error().Err(err).Msg("[cluster_prepare] query clusters failed")
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
proc, ok, fail := 0, 0, 0
|
||||||
|
var failedIDs []uuid.UUID
|
||||||
|
var failures []ClusterPrepareFailure
|
||||||
|
|
||||||
|
perClusterTimeout := 8 * time.Minute
|
||||||
|
|
||||||
|
for i := range clusters {
|
||||||
|
c := &clusters[i]
|
||||||
|
proc++
|
||||||
|
|
||||||
|
// bastion must exist and be ready
|
||||||
|
if c.BastionServer == nil || c.BastionServerID == nil || *c.BastionServerID == uuid.Nil || c.BastionServer.Status != "ready" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
clusterLog := log.With().
|
||||||
|
Str("job", jobID).
|
||||||
|
Str("cluster_id", c.ID.String()).
|
||||||
|
Str("cluster_name", c.Name).
|
||||||
|
Logger()
|
||||||
|
|
||||||
|
clusterLog.Info().Msg("[cluster_prepare] starting")
|
||||||
|
|
||||||
|
if err := validateClusterForPrepare(c); err != nil {
|
||||||
|
fail++
|
||||||
|
failedIDs = append(failedIDs, c.ID)
|
||||||
|
failures = append(failures, ClusterPrepareFailure{
|
||||||
|
ClusterID: c.ID,
|
||||||
|
Step: "validate",
|
||||||
|
Reason: err.Error(),
|
||||||
|
})
|
||||||
|
clusterLog.Error().Err(err).Msg("[cluster_prepare] validation failed")
|
||||||
|
_ = setClusterStatus(db, c.ID, clusterStatusFailed, err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
allServers := flattenClusterServers(c)
|
||||||
|
keyPayloads, sshConfig, err := buildSSHAssetsForCluster(db, c, allServers)
|
||||||
|
if err != nil {
|
||||||
|
fail++
|
||||||
|
failedIDs = append(failedIDs, c.ID)
|
||||||
|
failures = append(failures, ClusterPrepareFailure{
|
||||||
|
ClusterID: c.ID,
|
||||||
|
Step: "build_ssh_assets",
|
||||||
|
Reason: err.Error(),
|
||||||
|
})
|
||||||
|
clusterLog.Error().Err(err).Msg("[cluster_prepare] build ssh assets failed")
|
||||||
|
_ = setClusterStatus(db, c.ID, clusterStatusFailed, err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
payloadJSON, err := json.MarshalIndent(c, "", " ")
|
||||||
|
if err != nil {
|
||||||
|
fail++
|
||||||
|
failedIDs = append(failedIDs, c.ID)
|
||||||
|
failures = append(failures, ClusterPrepareFailure{
|
||||||
|
ClusterID: c.ID,
|
||||||
|
Step: "marshal_payload",
|
||||||
|
Reason: err.Error(),
|
||||||
|
})
|
||||||
|
clusterLog.Error().Err(err).Msg("[cluster_prepare] json marshal failed")
|
||||||
|
_ = setClusterStatus(db, c.ID, clusterStatusFailed, err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
runCtx, cancel := context.WithTimeout(ctx, perClusterTimeout)
|
||||||
|
err = pushAssetsToBastion(runCtx, db, c, sshConfig, keyPayloads, payloadJSON)
|
||||||
|
cancel()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
fail++
|
||||||
|
failedIDs = append(failedIDs, c.ID)
|
||||||
|
failures = append(failures, ClusterPrepareFailure{
|
||||||
|
ClusterID: c.ID,
|
||||||
|
Step: "ssh_push",
|
||||||
|
Reason: err.Error(),
|
||||||
|
})
|
||||||
|
clusterLog.Error().Err(err).Msg("[cluster_prepare] failed to push assets to bastion")
|
||||||
|
_ = setClusterStatus(db, c.ID, clusterStatusFailed, err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := setClusterStatus(db, c.ID, clusterStatusPending, ""); err != nil {
|
||||||
|
fail++
|
||||||
|
failedIDs = append(failedIDs, c.ID)
|
||||||
|
failures = append(failures, ClusterPrepareFailure{
|
||||||
|
ClusterID: c.ID,
|
||||||
|
Step: "set_pending",
|
||||||
|
Reason: err.Error(),
|
||||||
|
})
|
||||||
|
clusterLog.Error().Err(err).Msg("[cluster_prepare] failed to mark cluster pending")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
ok++
|
||||||
|
clusterLog.Info().Msg("[cluster_prepare] cluster marked pending")
|
||||||
|
}
|
||||||
|
|
||||||
|
res := ClusterPrepareResult{
|
||||||
|
Status: "ok",
|
||||||
|
Processed: proc,
|
||||||
|
MarkedPending: ok,
|
||||||
|
Failed: fail,
|
||||||
|
ElapsedMs: int(time.Since(start).Milliseconds()),
|
||||||
|
FailedIDs: failedIDs,
|
||||||
|
Failures: failures,
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info().
|
||||||
|
Int("processed", proc).
|
||||||
|
Int("pending", ok).
|
||||||
|
Int("failed", fail).
|
||||||
|
Msg("[cluster_prepare] reconcile tick ok")
|
||||||
|
|
||||||
|
next := time.Now().Add(time.Duration(args.IntervalS) * time.Second)
|
||||||
|
_, _ = jobs.Enqueue(
|
||||||
|
ctx,
|
||||||
|
uuid.NewString(),
|
||||||
|
"prepare_cluster",
|
||||||
|
args,
|
||||||
|
archer.WithScheduleTime(next),
|
||||||
|
archer.WithMaxRetries(1),
|
||||||
|
)
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- helpers ----------
|
||||||
|
|
||||||
|
func validateClusterForPrepare(c *models.Cluster) error {
|
||||||
|
if c.BastionServer == nil || c.BastionServerID == nil || *c.BastionServerID == uuid.Nil {
|
||||||
|
return fmt.Errorf("missing bastion server")
|
||||||
|
}
|
||||||
|
if c.BastionServer.Status != "ready" {
|
||||||
|
return fmt.Errorf("bastion server not ready (status=%s)", c.BastionServer.Status)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CaptainDomain is a value type; presence is via *ID
|
||||||
|
if c.CaptainDomainID == nil || *c.CaptainDomainID == uuid.Nil {
|
||||||
|
return fmt.Errorf("missing captain domain for cluster")
|
||||||
|
}
|
||||||
|
|
||||||
|
// ControlPlaneRecordSet is a pointer; presence is via *ID + non-nil struct
|
||||||
|
if c.ControlPlaneRecordSetID == nil || *c.ControlPlaneRecordSetID == uuid.Nil || c.ControlPlaneRecordSet == nil {
|
||||||
|
return fmt.Errorf("missing control_plane_record_set for cluster")
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(c.NodePools) == 0 {
|
||||||
|
return fmt.Errorf("cluster has no node pools")
|
||||||
|
}
|
||||||
|
|
||||||
|
hasServer := false
|
||||||
|
for i := range c.NodePools {
|
||||||
|
if len(c.NodePools[i].Servers) > 0 {
|
||||||
|
hasServer = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !hasServer {
|
||||||
|
return fmt.Errorf("cluster has no servers attached to node pools")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func flattenClusterServers(c *models.Cluster) []*models.Server {
|
||||||
|
var out []*models.Server
|
||||||
|
for i := range c.NodePools {
|
||||||
|
for j := range c.NodePools[i].Servers {
|
||||||
|
s := &c.NodePools[i].Servers[j]
|
||||||
|
out = append(out, s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
type keyPayload struct {
|
||||||
|
FileName string
|
||||||
|
PrivateKeyB64 string
|
||||||
|
}
|
||||||
|
|
||||||
|
// build ssh-config for all servers + decrypt keys.
|
||||||
|
// ssh-config is intended to live on the bastion and connect via *private* IPs.
|
||||||
|
func buildSSHAssetsForCluster(db *gorm.DB, c *models.Cluster, servers []*models.Server) (map[uuid.UUID]keyPayload, string, error) {
|
||||||
|
var sb strings.Builder
|
||||||
|
keys := make(map[uuid.UUID]keyPayload)
|
||||||
|
|
||||||
|
for _, s := range servers {
|
||||||
|
// Defensive checks
|
||||||
|
if strings.TrimSpace(s.PrivateIPAddress) == "" {
|
||||||
|
return nil, "", fmt.Errorf("server %s missing private ip", s.ID)
|
||||||
|
}
|
||||||
|
if s.SshKeyID == uuid.Nil {
|
||||||
|
return nil, "", fmt.Errorf("server %s missing ssh key relation", s.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// de-dupe keys: many servers may share the same ssh key
|
||||||
|
if _, ok := keys[s.SshKeyID]; !ok {
|
||||||
|
priv, err := utils.DecryptForOrg(
|
||||||
|
s.OrganizationID,
|
||||||
|
s.SshKey.EncryptedPrivateKey,
|
||||||
|
s.SshKey.PrivateIV,
|
||||||
|
s.SshKey.PrivateTag,
|
||||||
|
db,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return nil, "", fmt.Errorf("decrypt key for server %s: %w", s.ID, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fname := fmt.Sprintf("%s.pem", s.SshKeyID.String())
|
||||||
|
keys[s.SshKeyID] = keyPayload{
|
||||||
|
FileName: fname,
|
||||||
|
PrivateKeyB64: base64.StdEncoding.EncodeToString([]byte(priv)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ssh config entry per server
|
||||||
|
keyFile := keys[s.SshKeyID].FileName
|
||||||
|
|
||||||
|
hostAlias := s.Hostname
|
||||||
|
if hostAlias == "" {
|
||||||
|
hostAlias = s.ID.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.WriteString(fmt.Sprintf("Host %s\n", hostAlias))
|
||||||
|
sb.WriteString(fmt.Sprintf(" HostName %s\n", s.PrivateIPAddress))
|
||||||
|
sb.WriteString(fmt.Sprintf(" User %s\n", s.SSHUser))
|
||||||
|
sb.WriteString(fmt.Sprintf(" IdentityFile ~/.ssh/autoglue/keys/%s\n", keyFile))
|
||||||
|
sb.WriteString(" IdentitiesOnly yes\n")
|
||||||
|
sb.WriteString(" StrictHostKeyChecking accept-new\n\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
return keys, sb.String(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func pushAssetsToBastion(
|
||||||
|
ctx context.Context,
|
||||||
|
db *gorm.DB,
|
||||||
|
c *models.Cluster,
|
||||||
|
sshConfig string,
|
||||||
|
keyPayloads map[uuid.UUID]keyPayload,
|
||||||
|
payloadJSON []byte,
|
||||||
|
) error {
|
||||||
|
bastion := c.BastionServer
|
||||||
|
if bastion == nil {
|
||||||
|
return fmt.Errorf("bastion server is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
if bastion.PublicIPAddress == nil || strings.TrimSpace(*bastion.PublicIPAddress) == "" {
|
||||||
|
return fmt.Errorf("bastion server missing public ip")
|
||||||
|
}
|
||||||
|
|
||||||
|
privKey, err := utils.DecryptForOrg(
|
||||||
|
bastion.OrganizationID,
|
||||||
|
bastion.SshKey.EncryptedPrivateKey,
|
||||||
|
bastion.SshKey.PrivateIV,
|
||||||
|
bastion.SshKey.PrivateTag,
|
||||||
|
db,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("decrypt bastion key: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
signer, err := ssh.ParsePrivateKey([]byte(privKey))
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("parse bastion private key: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
hkcb := makeDBHostKeyCallback(db, bastion)
|
||||||
|
|
||||||
|
config := &ssh.ClientConfig{
|
||||||
|
User: bastion.SSHUser,
|
||||||
|
Auth: []ssh.AuthMethod{ssh.PublicKeys(signer)},
|
||||||
|
HostKeyCallback: hkcb,
|
||||||
|
Timeout: 30 * time.Second,
|
||||||
|
}
|
||||||
|
|
||||||
|
host := net.JoinHostPort(*bastion.PublicIPAddress, "22")
|
||||||
|
|
||||||
|
dialer := &net.Dialer{}
|
||||||
|
conn, err := dialer.DialContext(ctx, "tcp", host)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("dial bastion: %w", err)
|
||||||
|
}
|
||||||
|
defer conn.Close()
|
||||||
|
|
||||||
|
cconn, chans, reqs, err := ssh.NewClientConn(conn, host, config)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("ssh handshake bastion: %w", err)
|
||||||
|
}
|
||||||
|
client := ssh.NewClient(cconn, chans, reqs)
|
||||||
|
defer client.Close()
|
||||||
|
|
||||||
|
sess, err := client.NewSession()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("ssh session: %w", err)
|
||||||
|
}
|
||||||
|
defer sess.Close()
|
||||||
|
|
||||||
|
// build one shot script to:
|
||||||
|
// - mkdir ~/.ssh/autoglue/keys
|
||||||
|
// - write cluster-specific ssh-config
|
||||||
|
// - write all private keys
|
||||||
|
// - write payload.json
|
||||||
|
clusterDir := fmt.Sprintf("$HOME/autoglue/clusters/%s", c.ID.String())
|
||||||
|
configPath := fmt.Sprintf("$HOME/.ssh/autoglue/cluster-%s.config", c.ID.String())
|
||||||
|
|
||||||
|
var script bytes.Buffer
|
||||||
|
|
||||||
|
script.WriteString("set -euo pipefail\n")
|
||||||
|
script.WriteString("mkdir -p \"$HOME/.ssh/autoglue/keys\"\n")
|
||||||
|
script.WriteString("mkdir -p " + clusterDir + "\n")
|
||||||
|
script.WriteString("chmod 700 \"$HOME/.ssh\" || true\n")
|
||||||
|
|
||||||
|
// ssh-config
|
||||||
|
script.WriteString("cat > " + configPath + " <<'EOF_CFG'\n")
|
||||||
|
script.WriteString(sshConfig)
|
||||||
|
script.WriteString("EOF_CFG\n")
|
||||||
|
script.WriteString("chmod 600 " + configPath + "\n")
|
||||||
|
|
||||||
|
// keys
|
||||||
|
for id, kp := range keyPayloads {
|
||||||
|
tag := "KEY_" + id.String()
|
||||||
|
target := fmt.Sprintf("$HOME/.ssh/autoglue/keys/%s", kp.FileName)
|
||||||
|
|
||||||
|
script.WriteString("cat <<'" + tag + "' | base64 -d > " + target + "\n")
|
||||||
|
script.WriteString(kp.PrivateKeyB64 + "\n")
|
||||||
|
script.WriteString(tag + "\n")
|
||||||
|
script.WriteString("chmod 600 " + target + "\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
// payload.json
|
||||||
|
payloadPath := clusterDir + "/payload.json"
|
||||||
|
script.WriteString("cat > " + payloadPath + " <<'EOF_PAYLOAD'\n")
|
||||||
|
script.Write(payloadJSON)
|
||||||
|
script.WriteString("\nEOF_PAYLOAD\n")
|
||||||
|
script.WriteString("chmod 600 " + payloadPath + "\n")
|
||||||
|
|
||||||
|
// If you later want to always include cluster configs automatically, you can
|
||||||
|
// optionally manage ~/.ssh/config here (kept simple for now).
|
||||||
|
|
||||||
|
sess.Stdin = strings.NewReader(script.String())
|
||||||
|
out, runErr := sess.CombinedOutput("bash -s")
|
||||||
|
|
||||||
|
if runErr != nil {
|
||||||
|
return wrapSSHError(runErr, string(out))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func setClusterStatus(db *gorm.DB, id uuid.UUID, status, lastError string) error {
|
||||||
|
updates := map[string]any{
|
||||||
|
"status": status,
|
||||||
|
"updated_at": time.Now(),
|
||||||
|
}
|
||||||
|
if lastError != "" {
|
||||||
|
updates["last_error"] = lastError
|
||||||
|
}
|
||||||
|
return db.Model(&models.Cluster{}).
|
||||||
|
Where("id = ?", id).
|
||||||
|
Updates(updates).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
// runMakeOnBastion runs `make <target>` from the cluster's directory on the bastion.
|
||||||
|
func runMakeOnBastion(
|
||||||
|
ctx context.Context,
|
||||||
|
db *gorm.DB,
|
||||||
|
c *models.Cluster,
|
||||||
|
target string,
|
||||||
|
) (string, error) {
|
||||||
|
bastion := c.BastionServer
|
||||||
|
if bastion == nil {
|
||||||
|
return "", fmt.Errorf("bastion server is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
if bastion.PublicIPAddress == nil || strings.TrimSpace(*bastion.PublicIPAddress) == "" {
|
||||||
|
return "", fmt.Errorf("bastion server missing public ip")
|
||||||
|
}
|
||||||
|
|
||||||
|
privKey, err := utils.DecryptForOrg(
|
||||||
|
bastion.OrganizationID,
|
||||||
|
bastion.SshKey.EncryptedPrivateKey,
|
||||||
|
bastion.SshKey.PrivateIV,
|
||||||
|
bastion.SshKey.PrivateTag,
|
||||||
|
db,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("decrypt bastion key: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
signer, err := ssh.ParsePrivateKey([]byte(privKey))
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("parse bastion private key: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
hkcb := makeDBHostKeyCallback(db, bastion)
|
||||||
|
|
||||||
|
config := &ssh.ClientConfig{
|
||||||
|
User: bastion.SSHUser,
|
||||||
|
Auth: []ssh.AuthMethod{ssh.PublicKeys(signer)},
|
||||||
|
HostKeyCallback: hkcb,
|
||||||
|
Timeout: 30 * time.Second,
|
||||||
|
}
|
||||||
|
|
||||||
|
host := net.JoinHostPort(*bastion.PublicIPAddress, "22")
|
||||||
|
|
||||||
|
dialer := &net.Dialer{}
|
||||||
|
conn, err := dialer.DialContext(ctx, "tcp", host)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("dial bastion: %w", err)
|
||||||
|
}
|
||||||
|
defer conn.Close()
|
||||||
|
|
||||||
|
cconn, chans, reqs, err := ssh.NewClientConn(conn, host, config)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("ssh handshake bastion: %w", err)
|
||||||
|
}
|
||||||
|
client := ssh.NewClient(cconn, chans, reqs)
|
||||||
|
defer client.Close()
|
||||||
|
|
||||||
|
sess, err := client.NewSession()
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("ssh session: %w", err)
|
||||||
|
}
|
||||||
|
defer sess.Close()
|
||||||
|
|
||||||
|
clusterDir := fmt.Sprintf("$HOME/autoglue/clusters/%s", c.ID.String())
|
||||||
|
cmd := fmt.Sprintf("cd %s && make %s", clusterDir, target)
|
||||||
|
|
||||||
|
out, runErr := sess.CombinedOutput(cmd)
|
||||||
|
if runErr != nil {
|
||||||
|
return string(out), wrapSSHError(runErr, string(out))
|
||||||
|
}
|
||||||
|
return string(out), nil
|
||||||
|
}
|
||||||
BIN
internal/web/dist/assets/index-BRRMZeeQ.js.br
vendored
BIN
internal/web/dist/assets/index-BRRMZeeQ.js.br
vendored
Binary file not shown.
BIN
internal/web/dist/assets/index-BRRMZeeQ.js.gz
vendored
BIN
internal/web/dist/assets/index-BRRMZeeQ.js.gz
vendored
Binary file not shown.
File diff suppressed because one or more lines are too long
BIN
internal/web/dist/assets/index-BwyDjDcq.js.br
vendored
Normal file
BIN
internal/web/dist/assets/index-BwyDjDcq.js.br
vendored
Normal file
Binary file not shown.
BIN
internal/web/dist/assets/index-BwyDjDcq.js.gz
vendored
Normal file
BIN
internal/web/dist/assets/index-BwyDjDcq.js.gz
vendored
Normal file
Binary file not shown.
File diff suppressed because one or more lines are too long
BIN
internal/web/dist/assets/index-VHZG0dIU.css.gz
vendored
BIN
internal/web/dist/assets/index-VHZG0dIU.css.gz
vendored
Binary file not shown.
4
internal/web/dist/assets/react-B7S5QDrv.js
vendored
4
internal/web/dist/assets/react-B7S5QDrv.js
vendored
File diff suppressed because one or more lines are too long
BIN
internal/web/dist/assets/react-B7S5QDrv.js.br
vendored
BIN
internal/web/dist/assets/react-B7S5QDrv.js.br
vendored
Binary file not shown.
BIN
internal/web/dist/assets/react-B7S5QDrv.js.gz
vendored
BIN
internal/web/dist/assets/react-B7S5QDrv.js.gz
vendored
Binary file not shown.
File diff suppressed because one or more lines are too long
4
internal/web/dist/assets/react-Dt2M6tWj.js
vendored
Normal file
4
internal/web/dist/assets/react-Dt2M6tWj.js
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
internal/web/dist/assets/react-Dt2M6tWj.js.br
vendored
Normal file
BIN
internal/web/dist/assets/react-Dt2M6tWj.js.br
vendored
Normal file
Binary file not shown.
BIN
internal/web/dist/assets/react-Dt2M6tWj.js.gz
vendored
Normal file
BIN
internal/web/dist/assets/react-Dt2M6tWj.js.gz
vendored
Normal file
Binary file not shown.
1
internal/web/dist/assets/react-Dt2M6tWj.js.map
vendored
Normal file
1
internal/web/dist/assets/react-Dt2M6tWj.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
4
internal/web/dist/index.html
vendored
4
internal/web/dist/index.html
vendored
@@ -5,8 +5,8 @@
|
|||||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>AutoGlue</title>
|
<title>AutoGlue</title>
|
||||||
<script type="module" crossorigin src="/assets/index-BRRMZeeQ.js"></script>
|
<script type="module" crossorigin src="/assets/index-BwyDjDcq.js"></script>
|
||||||
<link rel="modulepreload" crossorigin href="/assets/react-B7S5QDrv.js">
|
<link rel="modulepreload" crossorigin href="/assets/react-Dt2M6tWj.js">
|
||||||
<link rel="stylesheet" crossorigin href="/assets/index-VHZG0dIU.css">
|
<link rel="stylesheet" crossorigin href="/assets/index-VHZG0dIU.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
BIN
internal/web/dist/index.html.br
vendored
BIN
internal/web/dist/index.html.br
vendored
Binary file not shown.
BIN
internal/web/dist/index.html.gz
vendored
BIN
internal/web/dist/index.html.gz
vendored
Binary file not shown.
@@ -16,6 +16,6 @@
|
|||||||
"prepare": "npm run build"
|
"prepare": "npm run build"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"typescript": "^4.0 || ^5.0"
|
"typescript": "5.9.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@
|
|||||||
"date-fns": "^4.1.0",
|
"date-fns": "^4.1.0",
|
||||||
"embla-carousel-react": "^8.6.0",
|
"embla-carousel-react": "^8.6.0",
|
||||||
"input-otp": "^1.4.2",
|
"input-otp": "^1.4.2",
|
||||||
"lucide-react": "^0.555.0",
|
"lucide-react": "^0.556.0",
|
||||||
"motion": "^12.23.25",
|
"motion": "^12.23.25",
|
||||||
"next-themes": "^0.4.6",
|
"next-themes": "^0.4.6",
|
||||||
"rapidoc": "^9.3.8",
|
"rapidoc": "^9.3.8",
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export type NavItem = {
|
|||||||
|
|
||||||
export const mainNav: NavItem[] = [
|
export const mainNav: NavItem[] = [
|
||||||
{ to: "/clusters", label: "Clusters", icon: AiOutlineCluster },
|
{ to: "/clusters", label: "Clusters", icon: AiOutlineCluster },
|
||||||
{ to: "/load-balancers", label: "Load Balancers", icon: TbLoadBalancer},
|
{ to: "/load-balancers", label: "Load Balancers", icon: TbLoadBalancer },
|
||||||
{ to: "/dns", label: "DNS", icon: MdOutlineDns },
|
{ to: "/dns", label: "DNS", icon: MdOutlineDns },
|
||||||
{ to: "/node-pools", label: "Node Pools", icon: BoxesIcon },
|
{ to: "/node-pools", label: "Node Pools", icon: BoxesIcon },
|
||||||
{ to: "/annotations", label: "Annotations", icon: ComponentIcon },
|
{ to: "/annotations", label: "Annotations", icon: ComponentIcon },
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
;
|
;
|
||||||
|
|
||||||
// src/pages/ClustersPage.tsx
|
// src/pages/ClustersPage.tsx
|
||||||
|
|
||||||
import { useEffect, useMemo, useState } from "react";
|
import { useEffect, useMemo, useState } from "react";
|
||||||
@@ -28,36 +27,6 @@ import { Label } from "@/components/ui/label.tsx";
|
|||||||
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select.tsx";
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select.tsx";
|
||||||
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table.tsx";
|
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table.tsx";
|
||||||
import { Textarea } from "@/components/ui/textarea.tsx";
|
import { Textarea } from "@/components/ui/textarea.tsx";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -67,7 +36,7 @@ import { Textarea } from "@/components/ui/textarea.tsx";
|
|||||||
|
|
||||||
const createClusterSchema = z.object({
|
const createClusterSchema = z.object({
|
||||||
name: z.string().trim().min(1, "Name is required").max(120, "Max 120 chars"),
|
name: z.string().trim().min(1, "Name is required").max(120, "Max 120 chars"),
|
||||||
provider: z.string().trim().min(1, "Provider is required").max(120, "Max 120 chars"),
|
cluster_provider: z.string().trim().min(1, "Provider is required").max(120, "Max 120 chars"),
|
||||||
region: z.string().trim().min(1, "Region is required").max(120, "Max 120 chars"),
|
region: z.string().trim().min(1, "Region is required").max(120, "Max 120 chars"),
|
||||||
})
|
})
|
||||||
type CreateClusterInput = z.input<typeof createClusterSchema>
|
type CreateClusterInput = z.input<typeof createClusterSchema>
|
||||||
@@ -133,12 +102,12 @@ function StatusBadge({ status }: { status?: string | null }) {
|
|||||||
|
|
||||||
function ClusterSummary({ c }: { c: DtoClusterResponse }) {
|
function ClusterSummary({ c }: { c: DtoClusterResponse }) {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-1 text-xs text-muted-foreground">
|
<div className="text-muted-foreground flex flex-col gap-1 text-xs">
|
||||||
<div className="flex flex-wrap items-center gap-2">
|
<div className="flex flex-wrap items-center gap-2">
|
||||||
{c.provider && (
|
{c.cluster_provider && (
|
||||||
<span className="inline-flex items-center gap-1">
|
<span className="inline-flex items-center gap-1">
|
||||||
<Globe2 className="h-3 w-3" />
|
<Globe2 className="h-3 w-3" />
|
||||||
{c.provider}
|
{c.cluster_provider}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
{c.region && (
|
{c.region && (
|
||||||
@@ -227,7 +196,7 @@ export const ClustersPage = () => {
|
|||||||
resolver: zodResolver(createClusterSchema),
|
resolver: zodResolver(createClusterSchema),
|
||||||
defaultValues: {
|
defaultValues: {
|
||||||
name: "",
|
name: "",
|
||||||
provider: "",
|
cluster_provider: "",
|
||||||
region: "",
|
region: "",
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@@ -275,7 +244,7 @@ export const ClustersPage = () => {
|
|||||||
setEditingId(cluster.id)
|
setEditingId(cluster.id)
|
||||||
updateForm.reset({
|
updateForm.reset({
|
||||||
name: cluster.name ?? "",
|
name: cluster.name ?? "",
|
||||||
provider: cluster.provider ?? "",
|
cluster_provider: cluster.cluster_provider ?? "",
|
||||||
region: cluster.region ?? "",
|
region: cluster.region ?? "",
|
||||||
})
|
})
|
||||||
setUpdateOpen(true)
|
setUpdateOpen(true)
|
||||||
@@ -305,7 +274,7 @@ export const ClustersPage = () => {
|
|||||||
? data.filter((c) => {
|
? data.filter((c) => {
|
||||||
return (
|
return (
|
||||||
c.name?.toLowerCase().includes(q) ||
|
c.name?.toLowerCase().includes(q) ||
|
||||||
c.provider?.toLowerCase().includes(q) ||
|
c.cluster_provider?.toLowerCase().includes(q) ||
|
||||||
c.region?.toLowerCase().includes(q) ||
|
c.region?.toLowerCase().includes(q) ||
|
||||||
c.status?.toLowerCase().includes(q)
|
c.status?.toLowerCase().includes(q)
|
||||||
)
|
)
|
||||||
@@ -647,7 +616,7 @@ export const ClustersPage = () => {
|
|||||||
|
|
||||||
<FormField
|
<FormField
|
||||||
control={createForm.control}
|
control={createForm.control}
|
||||||
name="provider"
|
name="cluster_provider"
|
||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<FormLabel>Provider</FormLabel>
|
<FormLabel>Provider</FormLabel>
|
||||||
@@ -705,7 +674,7 @@ export const ClustersPage = () => {
|
|||||||
{filtered.map((c: DtoClusterResponse) => (
|
{filtered.map((c: DtoClusterResponse) => (
|
||||||
<TableRow key={c.id}>
|
<TableRow key={c.id}>
|
||||||
<TableCell className="font-medium">{c.name}</TableCell>
|
<TableCell className="font-medium">{c.name}</TableCell>
|
||||||
<TableCell>{c.provider}</TableCell>
|
<TableCell>{c.cluster_provider}</TableCell>
|
||||||
<TableCell>{c.region}</TableCell>
|
<TableCell>{c.region}</TableCell>
|
||||||
<TableCell>
|
<TableCell>
|
||||||
<StatusBadge status={c.status} />
|
<StatusBadge status={c.status} />
|
||||||
@@ -787,7 +756,7 @@ export const ClustersPage = () => {
|
|||||||
|
|
||||||
<FormField
|
<FormField
|
||||||
control={updateForm.control}
|
control={updateForm.control}
|
||||||
name="provider"
|
name="cluster_provider"
|
||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<FormLabel>Provider</FormLabel>
|
<FormLabel>Provider</FormLabel>
|
||||||
@@ -843,7 +812,7 @@ export const ClustersPage = () => {
|
|||||||
<div>
|
<div>
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<FileCode2 className="h-4 w-4" />
|
<FileCode2 className="h-4 w-4" />
|
||||||
<h3 className="font-semibold text-sm">Kubeconfig</h3>
|
<h3 className="text-sm font-semibold">Kubeconfig</h3>
|
||||||
</div>
|
</div>
|
||||||
<p className="text-muted-foreground text-xs">
|
<p className="text-muted-foreground text-xs">
|
||||||
Paste the kubeconfig for this cluster. It will be stored encrypted and never
|
Paste the kubeconfig for this cluster. It will be stored encrypted and never
|
||||||
@@ -861,11 +830,7 @@ export const ClustersPage = () => {
|
|||||||
/>
|
/>
|
||||||
|
|
||||||
<div className="flex flex-wrap gap-2">
|
<div className="flex flex-wrap gap-2">
|
||||||
<Button
|
<Button size="sm" onClick={handleSetKubeconfig} disabled={isBusy("kubeconfig")}>
|
||||||
size="sm"
|
|
||||||
onClick={handleSetKubeconfig}
|
|
||||||
disabled={isBusy("kubeconfig")}
|
|
||||||
>
|
|
||||||
{isBusy("kubeconfig") ? "Saving…" : "Save kubeconfig"}
|
{isBusy("kubeconfig") ? "Saving…" : "Save kubeconfig"}
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
@@ -883,7 +848,7 @@ export const ClustersPage = () => {
|
|||||||
<section className="space-y-2 rounded-xl border p-4">
|
<section className="space-y-2 rounded-xl border p-4">
|
||||||
<div className="flex items-center justify-between gap-2">
|
<div className="flex items-center justify-between gap-2">
|
||||||
<div>
|
<div>
|
||||||
<h3 className="font-semibold text-sm">Captain Domain</h3>
|
<h3 className="text-sm font-semibold">Captain Domain</h3>
|
||||||
<p className="text-muted-foreground text-xs">
|
<p className="text-muted-foreground text-xs">
|
||||||
Domain used for the AutoGlue captain endpoint.
|
Domain used for the AutoGlue captain endpoint.
|
||||||
</p>
|
</p>
|
||||||
@@ -909,9 +874,7 @@ export const ClustersPage = () => {
|
|||||||
>
|
>
|
||||||
<SelectTrigger className="w-full">
|
<SelectTrigger className="w-full">
|
||||||
<SelectValue
|
<SelectValue
|
||||||
placeholder={
|
placeholder={domainsQ.isLoading ? "Loading domains…" : "Select domain"}
|
||||||
domainsQ.isLoading ? "Loading domains…" : "Select domain"
|
|
||||||
}
|
|
||||||
/>
|
/>
|
||||||
</SelectTrigger>
|
</SelectTrigger>
|
||||||
<SelectContent>
|
<SelectContent>
|
||||||
@@ -952,7 +915,7 @@ export const ClustersPage = () => {
|
|||||||
<section className="space-y-2 rounded-xl border p-4">
|
<section className="space-y-2 rounded-xl border p-4">
|
||||||
<div className="flex items-center justify-between gap-2">
|
<div className="flex items-center justify-between gap-2">
|
||||||
<div>
|
<div>
|
||||||
<h3 className="font-semibold text-sm">Control Plane Record Set</h3>
|
<h3 className="text-sm font-semibold">Control Plane Record Set</h3>
|
||||||
<p className="text-muted-foreground text-xs">
|
<p className="text-muted-foreground text-xs">
|
||||||
DNS record set used for the cluster control plane endpoint.
|
DNS record set used for the cluster control plane endpoint.
|
||||||
</p>
|
</p>
|
||||||
@@ -973,9 +936,7 @@ export const ClustersPage = () => {
|
|||||||
<SelectTrigger className="w-full">
|
<SelectTrigger className="w-full">
|
||||||
<SelectValue
|
<SelectValue
|
||||||
placeholder={
|
placeholder={
|
||||||
recordSetsQ.isLoading
|
recordSetsQ.isLoading ? "Loading record sets…" : "Select record set"
|
||||||
? "Loading record sets…"
|
|
||||||
: "Select record set"
|
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
</SelectTrigger>
|
</SelectTrigger>
|
||||||
@@ -1000,9 +961,7 @@ export const ClustersPage = () => {
|
|||||||
size="sm"
|
size="sm"
|
||||||
variant="outline"
|
variant="outline"
|
||||||
onClick={handleDetachRecordSet}
|
onClick={handleDetachRecordSet}
|
||||||
disabled={
|
disabled={isBusy("recordset") || !configCluster.control_plane_record_set}
|
||||||
isBusy("recordset") || !configCluster.control_plane_record_set
|
|
||||||
}
|
|
||||||
>
|
>
|
||||||
Detach
|
Detach
|
||||||
</Button>
|
</Button>
|
||||||
@@ -1015,7 +974,7 @@ export const ClustersPage = () => {
|
|||||||
<section className="space-y-2 rounded-xl border p-4">
|
<section className="space-y-2 rounded-xl border p-4">
|
||||||
<div className="flex items-center justify-between gap-2">
|
<div className="flex items-center justify-between gap-2">
|
||||||
<div>
|
<div>
|
||||||
<h3 className="font-semibold text-sm">Apps Load Balancer</h3>
|
<h3 className="text-sm font-semibold">Apps Load Balancer</h3>
|
||||||
<p className="text-muted-foreground text-xs">
|
<p className="text-muted-foreground text-xs">
|
||||||
Frontend load balancer for application traffic.
|
Frontend load balancer for application traffic.
|
||||||
</p>
|
</p>
|
||||||
@@ -1073,7 +1032,7 @@ export const ClustersPage = () => {
|
|||||||
<section className="space-y-2 rounded-xl border p-4">
|
<section className="space-y-2 rounded-xl border p-4">
|
||||||
<div className="flex items-center justify-between gap-2">
|
<div className="flex items-center justify-between gap-2">
|
||||||
<div>
|
<div>
|
||||||
<h3 className="font-semibold text-sm">GlueOps / Control-plane Load Balancer</h3>
|
<h3 className="text-sm font-semibold">GlueOps / Control-plane Load Balancer</h3>
|
||||||
<p className="text-muted-foreground text-xs">
|
<p className="text-muted-foreground text-xs">
|
||||||
Load balancer for GlueOps/control-plane traffic.
|
Load balancer for GlueOps/control-plane traffic.
|
||||||
</p>
|
</p>
|
||||||
@@ -1133,7 +1092,7 @@ export const ClustersPage = () => {
|
|||||||
<div>
|
<div>
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<Server className="h-4 w-4" />
|
<Server className="h-4 w-4" />
|
||||||
<h3 className="font-semibold text-sm">Bastion Server</h3>
|
<h3 className="text-sm font-semibold">Bastion Server</h3>
|
||||||
</div>
|
</div>
|
||||||
<p className="text-muted-foreground text-xs">
|
<p className="text-muted-foreground text-xs">
|
||||||
SSH bastion used to reach the cluster nodes.
|
SSH bastion used to reach the cluster nodes.
|
||||||
@@ -1142,8 +1101,7 @@ export const ClustersPage = () => {
|
|||||||
<div className="text-right text-xs">
|
<div className="text-right text-xs">
|
||||||
<div className="font-mono">
|
<div className="font-mono">
|
||||||
{configCluster.bastion_server
|
{configCluster.bastion_server
|
||||||
? configCluster.bastion_server.hostname ??
|
? (configCluster.bastion_server.hostname ?? configCluster.bastion_server.id)
|
||||||
configCluster.bastion_server.id
|
|
||||||
: "Not attached"}
|
: "Not attached"}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1155,9 +1113,7 @@ export const ClustersPage = () => {
|
|||||||
<Select value={bastionId} onValueChange={(val) => setBastionId(val)}>
|
<Select value={bastionId} onValueChange={(val) => setBastionId(val)}>
|
||||||
<SelectTrigger className="w-full">
|
<SelectTrigger className="w-full">
|
||||||
<SelectValue
|
<SelectValue
|
||||||
placeholder={
|
placeholder={serversQ.isLoading ? "Loading servers…" : "Select server"}
|
||||||
serversQ.isLoading ? "Loading servers…" : "Select server"
|
|
||||||
}
|
|
||||||
/>
|
/>
|
||||||
</SelectTrigger>
|
</SelectTrigger>
|
||||||
<SelectContent>
|
<SelectContent>
|
||||||
@@ -1193,7 +1149,7 @@ export const ClustersPage = () => {
|
|||||||
<section className="space-y-2 rounded-xl border p-4">
|
<section className="space-y-2 rounded-xl border p-4">
|
||||||
<div className="flex items-center justify-between gap-2">
|
<div className="flex items-center justify-between gap-2">
|
||||||
<div>
|
<div>
|
||||||
<h3 className="font-semibold text-sm">Node Pools</h3>
|
<h3 className="text-sm font-semibold">Node Pools</h3>
|
||||||
<p className="text-muted-foreground text-xs">
|
<p className="text-muted-foreground text-xs">
|
||||||
Attach node pools to this cluster. Each node pool may have its own labels,
|
Attach node pools to this cluster. Each node pool may have its own labels,
|
||||||
taints, and backing servers.
|
taints, and backing servers.
|
||||||
@@ -1207,9 +1163,7 @@ export const ClustersPage = () => {
|
|||||||
<Select value={nodePoolId} onValueChange={(val) => setNodePoolId(val)}>
|
<Select value={nodePoolId} onValueChange={(val) => setNodePoolId(val)}>
|
||||||
<SelectTrigger className="w-full">
|
<SelectTrigger className="w-full">
|
||||||
<SelectValue
|
<SelectValue
|
||||||
placeholder={
|
placeholder={npQ.isLoading ? "Loading node pools…" : "Select node pool"}
|
||||||
npQ.isLoading ? "Loading node pools…" : "Select node pool"
|
|
||||||
}
|
|
||||||
/>
|
/>
|
||||||
</SelectTrigger>
|
</SelectTrigger>
|
||||||
<SelectContent>
|
<SelectContent>
|
||||||
|
|||||||
@@ -1,27 +1,33 @@
|
|||||||
import { useMemo, useState } from "react";
|
import { useMemo, useState } from "react"
|
||||||
import { credentialsApi } from "@/api/credentials";
|
import { credentialsApi } from "@/api/credentials"
|
||||||
import { zodResolver } from "@hookform/resolvers/zod";
|
import { zodResolver } from "@hookform/resolvers/zod"
|
||||||
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"
|
||||||
import { AlertTriangle, Eye, Loader2, MoreHorizontal, Pencil, Plus, Search, Trash2 } from "lucide-react";
|
import { AlertTriangle, Eye, Loader2, MoreHorizontal, Pencil, Plus, Search, Trash2 } from "lucide-react"
|
||||||
import { Controller, useForm } from "react-hook-form";
|
import { Controller, useForm } from "react-hook-form"
|
||||||
import { toast } from "sonner";
|
import { toast } from "sonner"
|
||||||
import { z } from "zod";
|
import { z } from "zod"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from "@/components/ui/alert-dialog";
|
|
||||||
import { Badge } from "@/components/ui/badge";
|
|
||||||
import { Button } from "@/components/ui/button";
|
|
||||||
import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog";
|
|
||||||
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu";
|
|
||||||
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form";
|
|
||||||
import { Input } from "@/components/ui/input";
|
|
||||||
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
|
|
||||||
import { Switch } from "@/components/ui/switch";
|
|
||||||
import { Textarea } from "@/components/ui/textarea";
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import {
|
||||||
|
AlertDialog,
|
||||||
|
AlertDialogAction,
|
||||||
|
AlertDialogCancel,
|
||||||
|
AlertDialogContent,
|
||||||
|
AlertDialogDescription,
|
||||||
|
AlertDialogFooter,
|
||||||
|
AlertDialogHeader,
|
||||||
|
AlertDialogTitle,
|
||||||
|
AlertDialogTrigger
|
||||||
|
} from "@/components/ui/alert-dialog"
|
||||||
|
import { Badge } from "@/components/ui/badge"
|
||||||
|
import { Button } from "@/components/ui/button"
|
||||||
|
import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"
|
||||||
|
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"
|
||||||
|
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"
|
||||||
|
import { Input } from "@/components/ui/input"
|
||||||
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
|
||||||
|
import { Switch } from "@/components/ui/switch"
|
||||||
|
import { Textarea } from "@/components/ui/textarea"
|
||||||
|
|
||||||
|
|
||||||
// -------------------- Constants --------------------
|
// -------------------- Constants --------------------
|
||||||
@@ -160,10 +166,22 @@ function extractErr(e: any): string {
|
|||||||
return "Unknown error"
|
return "Unknown error"
|
||||||
}
|
}
|
||||||
|
|
||||||
function isAwsServiceScope({ credential_provider, scope_kind }: { credential_provider?: string; scope_kind?: string }) {
|
function isAwsServiceScope({
|
||||||
|
credential_provider,
|
||||||
|
scope_kind,
|
||||||
|
}: {
|
||||||
|
credential_provider?: string
|
||||||
|
scope_kind?: string
|
||||||
|
}) {
|
||||||
return credential_provider === "aws" && scope_kind === "service"
|
return credential_provider === "aws" && scope_kind === "service"
|
||||||
}
|
}
|
||||||
function isAwsResourceScope({ credential_provider, scope_kind }: { credential_provider?: string; scope_kind?: string }) {
|
function isAwsResourceScope({
|
||||||
|
credential_provider,
|
||||||
|
scope_kind,
|
||||||
|
}: {
|
||||||
|
credential_provider?: string
|
||||||
|
scope_kind?: string
|
||||||
|
}) {
|
||||||
return credential_provider === "aws" && scope_kind === "resource"
|
return credential_provider === "aws" && scope_kind === "resource"
|
||||||
}
|
}
|
||||||
function isProviderScope({ scope_kind }: { scope_kind?: string }) {
|
function isProviderScope({ scope_kind }: { scope_kind?: string }) {
|
||||||
@@ -942,7 +960,7 @@ export const CredentialPage = () => {
|
|||||||
<code className="bg-muted rounded px-1">{row.id.slice(0, 8)}…</code>
|
<code className="bg-muted rounded px-1">{row.id.slice(0, 8)}…</code>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td className="px-4 py-2">{row.provider}</td>
|
<td className="px-4 py-2">{row.credential_provider}</td>
|
||||||
<td className="px-4 py-2">{row.kind}</td>
|
<td className="px-4 py-2">{row.kind}</td>
|
||||||
<td className="px-4 py-2">
|
<td className="px-4 py-2">
|
||||||
<Badge variant="secondary">{row.scope_kind}</Badge>
|
<Badge variant="secondary">{row.scope_kind}</Badge>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useEffect, useRef, useState, type FC } from "react"
|
import { type FC, useEffect, useRef, useState } from "react"
|
||||||
import { useTheme } from "next-themes"
|
import { useTheme } from "next-themes"
|
||||||
|
|
||||||
import { Button } from "@/components/ui/button"
|
import { Button } from "@/components/ui/button"
|
||||||
@@ -7,13 +7,7 @@ import { Input } from "@/components/ui/input"
|
|||||||
import "rapidoc"
|
import "rapidoc"
|
||||||
|
|
||||||
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card.tsx"
|
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card.tsx"
|
||||||
import {
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select.tsx"
|
||||||
Select,
|
|
||||||
SelectContent,
|
|
||||||
SelectItem,
|
|
||||||
SelectTrigger,
|
|
||||||
SelectValue,
|
|
||||||
} from "@/components/ui/select.tsx"
|
|
||||||
|
|
||||||
type RdThemeMode = "auto" | "light" | "dark"
|
type RdThemeMode = "auto" | "light" | "dark"
|
||||||
|
|
||||||
|
|||||||
510
ui/yarn.lock
510
ui/yarn.lock
@@ -1527,26 +1527,26 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@standard-schema/utils/-/utils-0.3.0.tgz#3d5e608f16c2390c10528e98e59aef6bf73cae7b"
|
resolved "https://registry.yarnpkg.com/@standard-schema/utils/-/utils-0.3.0.tgz#3d5e608f16c2390c10528e98e59aef6bf73cae7b"
|
||||||
integrity sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==
|
integrity sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==
|
||||||
|
|
||||||
"@swagger-api/apidom-ast@^1.0.0":
|
"@swagger-api/apidom-ast@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ast/-/apidom-ast-1.0.0.tgz#3e9f99dd04a2dd4539ae8b2a28a1e6f39f964e26"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ast/-/apidom-ast-1.0.1.tgz#60369b17a358add6121a599d92f2e8cfd969f743"
|
||||||
integrity sha512-Yy57roPVh5I+wz509OX++TY2iR05oUszJI9JSNvY8bHplURnnag6YjKjbklvEVo07ZNl9SfTZ7ZLer+56O/4gg==
|
integrity sha512-inTGo5b49XkHs/Vq48VafXnCzZrwwE+KTNcdfMybdm3RQTbfVFbvSUrS54WoHoaSbef1GsB9rnS/oXoXfNr72g==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-error" "^1.0.0"
|
"@swagger-api/apidom-error" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
unraw "^3.0.0"
|
unraw "^3.0.0"
|
||||||
|
|
||||||
"@swagger-api/apidom-core@^1.0.0", "@swagger-api/apidom-core@^1.0.0-rc.1":
|
"@swagger-api/apidom-core@^1.0.0-rc.1", "@swagger-api/apidom-core@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-core/-/apidom-core-1.0.0.tgz#7e8559027236b15d13e968e744c3ffa593c2525e"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-core/-/apidom-core-1.0.1.tgz#bd0a72a15d08ed5264450f0a3fd4062843de2b9f"
|
||||||
integrity sha512-xIVB1g+P5XBJS4OUSlNwtw/8KeeRHjnUQWxXLtT7B4pt22QwhprRJe0CymwxzvubDuIFxo5kgC3CgVvMhwI1sw==
|
integrity sha512-biA53spAUphP2IMJSPdqcRFjvLbvLspv1mJQrZpePUq4XGxGOKOHof7dUc1bXJuYvl6OOxOwnVniv5oK2Wyblw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-ast" "^1.0.0"
|
"@swagger-api/apidom-ast" "^1.0.1"
|
||||||
"@swagger-api/apidom-error" "^1.0.0"
|
"@swagger-api/apidom-error" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
minim "~0.23.8"
|
minim "~0.23.8"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
@@ -1554,302 +1554,302 @@
|
|||||||
short-unique-id "^5.3.2"
|
short-unique-id "^5.3.2"
|
||||||
ts-mixer "^6.0.3"
|
ts-mixer "^6.0.3"
|
||||||
|
|
||||||
"@swagger-api/apidom-error@^1.0.0", "@swagger-api/apidom-error@^1.0.0-rc.1":
|
"@swagger-api/apidom-error@^1.0.0-rc.1", "@swagger-api/apidom-error@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-error/-/apidom-error-1.0.0.tgz#c39e59919f9b903fe70f45b37423e509e0cdf4d4"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-error/-/apidom-error-1.0.1.tgz#65b4a07f8765f097f9de7e9c85ffc25a009df577"
|
||||||
integrity sha512-L8fmgQYQfuPCPNlF6KvVXrMuWYh4uxsz955gircsPnV5V2oEaaNVRrQQMHCebvSOAp3OaM8jiiR1FVdzSxkoKg==
|
integrity sha512-uwduVNLg9a2qA+Pl4b8gPERH6Xhvm/Ilv4iKMUOpUicLwNmYjrlcRsyYxLvFiNlTghm70xuI3hap1iaXbrer4A==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.20.7"
|
"@babel/runtime-corejs3" "^7.20.7"
|
||||||
|
|
||||||
"@swagger-api/apidom-json-pointer@^1.0.0", "@swagger-api/apidom-json-pointer@^1.0.0-rc.0", "@swagger-api/apidom-json-pointer@^1.0.0-rc.1":
|
"@swagger-api/apidom-json-pointer@^1.0.0-rc.1", "@swagger-api/apidom-json-pointer@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.0.tgz#51d46f90275566ed922932ee4d20c9c29f8c93a7"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.1.tgz#877e08807c9e7a3ac1db200dd4995f194fd1c2ba"
|
||||||
integrity sha512-M2k5/79fEjgfe0EZ+LpwKHi83744WV0/GuU3suAYKRdO/GJclQBUalOMnAyxjSnQLqtNw1jSjVvIsRhArcC9GQ==
|
integrity sha512-Dgxd9hl1AiCIM1b5f4dSfmP+rGtASUso8Lw51+az605hqrohgykxt8voiQtaJxKySWYbS1J9Vz2xjLwrEmfTKg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-error" "^1.0.0"
|
"@swagger-api/apidom-error" "^1.0.1"
|
||||||
"@swaggerexpert/json-pointer" "^2.10.1"
|
"@swaggerexpert/json-pointer" "^2.10.1"
|
||||||
|
|
||||||
"@swagger-api/apidom-ns-api-design-systems@^1.0.0":
|
"@swagger-api/apidom-ns-api-design-systems@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.0.tgz#fe714b2a8916880c54fbd16b4cb070fa5e84ca46"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.1.tgz#9a395ce31afa5f93e5e4da6de5d988af8c1cbf10"
|
||||||
integrity sha512-RUYnXx8jBc01rOygYWLU9i3aJZ7x18Cyf4IXlBtDbqSOjw3oxnmZ6dw52zfrOpaBtsGBFO0VjHWnzPeOoAnGpQ==
|
integrity sha512-frRfiLjcufeBgqnHQOcXgl6dnvcIdP4+18pWb+qT3N+dv87geJBk1CbXo6RjW9AEQX/7BtvWYkfSMLrh8q2TZA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-error" "^1.0.0"
|
"@swagger-api/apidom-error" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-openapi-3-1" "^1.0.0"
|
"@swagger-api/apidom-ns-openapi-3-1" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
ts-mixer "^6.0.3"
|
ts-mixer "^6.0.3"
|
||||||
|
|
||||||
"@swagger-api/apidom-ns-arazzo-1@^1.0.0", "@swagger-api/apidom-ns-arazzo-1@^1.0.0-rc.0":
|
"@swagger-api/apidom-ns-arazzo-1@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.0.0.tgz#c43324f259fbe1eb8a812ee96fc0f71a5fb80cab"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.0.1.tgz#fbdc3995ff08bdc2c4318336fab4927823e6d75c"
|
||||||
integrity sha512-zdswSbzGeXu3mvH+FMfI8BP/hC0oReDzZEGmRNN/g9JzyI6bhcciGdFNk3haWFed2Hwa8iWCw6r0O70sJXxktA==
|
integrity sha512-gJJY0vmi3TJtlCYNPsZahQnP6GA9GtJX1a9jEUASaYYxz6cBBfY39y8C5tQTo0Jvc7QEff/UZ8iGX0kltcwlzA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-json-schema-2020-12" "^1.0.0"
|
"@swagger-api/apidom-ns-json-schema-2020-12" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
ts-mixer "^6.0.3"
|
ts-mixer "^6.0.3"
|
||||||
|
|
||||||
"@swagger-api/apidom-ns-asyncapi-2@^1.0.0", "@swagger-api/apidom-ns-asyncapi-2@^1.0.0-rc.0":
|
"@swagger-api/apidom-ns-asyncapi-2@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.0.tgz#fb4ce8501462b2ead37ff9f39516983559cea27c"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.1.tgz#24db11873f988cbc1e307f13f0964693f1eb8d3f"
|
||||||
integrity sha512-n9EswUqPHOv6rBX0OJSNhJMNM2Psdqeux9w0+XVHPfsCwyZqVQ0HxasLlgXurRaOscdRJ3W6z62t2T9krMiPXg==
|
integrity sha512-d8HBr2EVB2gK8FKrxj0Wsss6Qeael//WxnNv1ZtmNeCe1l83iC9RO/hjjq/OFob94ZTOfpPRNwGqZBd4tMxOnA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-json-schema-draft-7" "^1.0.0"
|
"@swagger-api/apidom-ns-json-schema-draft-7" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
ts-mixer "^6.0.3"
|
ts-mixer "^6.0.3"
|
||||||
|
|
||||||
"@swagger-api/apidom-ns-asyncapi-3@^1.0.0":
|
"@swagger-api/apidom-ns-asyncapi-3@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-asyncapi-3/-/apidom-ns-asyncapi-3-1.0.0.tgz#ff198136e72319f918aa27312ac7ea85bb94d95d"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-asyncapi-3/-/apidom-ns-asyncapi-3-1.0.1.tgz#56d75c2f46686440d244404d28ac05379d5e3be8"
|
||||||
integrity sha512-6Rp9C1RhQyBvYJ/OCuihZprXErryPJqilgHU6xg67QWyOBFQ1VTzSmP9pecMtDD+YiJsU6HB6GYDF+oEzXFkKQ==
|
integrity sha512-vonGt1ScMlT+GbbSGa/+oe874Zl7NVylX3ZoMAhMkRyqu49vmWB6dXUcWw6ZsZu2GxVphjNTm+D52Ikw8UAMWg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-asyncapi-2" "^1.0.0"
|
"@swagger-api/apidom-ns-asyncapi-2" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
ts-mixer "^6.0.3"
|
ts-mixer "^6.0.3"
|
||||||
|
|
||||||
"@swagger-api/apidom-ns-json-schema-2019-09@^1.0.0":
|
"@swagger-api/apidom-ns-json-schema-2019-09@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.0.0.tgz#5a8dcfa9a53d39350ae4e80b0a43dec26ed74a05"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.0.1.tgz#7cc94e08bbccb9cc383810ab6e9595527e2cc651"
|
||||||
integrity sha512-iZHeeQTiLbf5CjbGURusD+OngL/rJjNol35Qg/BeVFsJTzisCyDW6AHMK/0Qe+eRscGwGOkUxr+RhhSgSgXPbg==
|
integrity sha512-wtVkFhkM7a0ybjAR0HCQyXzAwIWWcaoHmXiZGAS7wTpI2sDMLwCrBXBuISa7BoRkG4ieA2odDF5Eac73knWUbA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-error" "^1.0.0"
|
"@swagger-api/apidom-error" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-json-schema-draft-7" "^1.0.0"
|
"@swagger-api/apidom-ns-json-schema-draft-7" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
ts-mixer "^6.0.4"
|
ts-mixer "^6.0.4"
|
||||||
|
|
||||||
"@swagger-api/apidom-ns-json-schema-2020-12@^1.0.0":
|
"@swagger-api/apidom-ns-json-schema-2020-12@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.0.0.tgz#64265ab1e11a57ba4e54cca21e21aee245782c8c"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.0.1.tgz#d82ef8202f4f781ad0221d3bdb7ed384e063e627"
|
||||||
integrity sha512-gHKECPM2k2BlOY/b8p/9/a96uKmUc2FC1ruRUgm/DOjv4jQtMkEBgVguI04g3wTpSwIg15o9p85RhhhAGHloQg==
|
integrity sha512-YBE5kYKARFWi+8HAiUVJxF9WpkdlW2ebH6K4oZt6mnOWROkPS+30Kjjxlz+Q994KhSZGBHKK0d3TU11xXUqyAQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-error" "^1.0.0"
|
"@swagger-api/apidom-error" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-json-schema-2019-09" "^1.0.0"
|
"@swagger-api/apidom-ns-json-schema-2019-09" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
ts-mixer "^6.0.4"
|
ts-mixer "^6.0.4"
|
||||||
|
|
||||||
"@swagger-api/apidom-ns-json-schema-draft-4@^1.0.0":
|
"@swagger-api/apidom-ns-json-schema-draft-4@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.0.tgz#0ec8261a23ade84bf0152504560bff9688809f2d"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.1.tgz#708e4b6dbe8a652c0480c289b227300310096929"
|
||||||
integrity sha512-yzkHhq5l0yd1nZbcrqlvUC0uYQ5A8XJo/PHOOD9eibxP/tvhrmkrGVnBEZIS7Y2lIx9goAtCHYJOzwOh2iZ+qQ==
|
integrity sha512-OR3D7EXVq2H07n9uPKpNCikKC5857Pggbi1g5rt9X0znaUgxTtkYu8unPfbEcjQgFVglzIwqbGhMnahUFXYaTA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-ast" "^1.0.0"
|
"@swagger-api/apidom-ast" "^1.0.1"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
ts-mixer "^6.0.4"
|
ts-mixer "^6.0.4"
|
||||||
|
|
||||||
"@swagger-api/apidom-ns-json-schema-draft-6@^1.0.0":
|
"@swagger-api/apidom-ns-json-schema-draft-6@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.0.tgz#e1085986390329bd46f184fc476a48a3086152a1"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.1.tgz#39e1b5170afc171c7c30ecea89eeae6e02ec1076"
|
||||||
integrity sha512-qjxwyq+dRRW4i/D2OMuuPpNfq215V6FMFMMnznAzqkYJIigUyAsslZt1YYGz5hug/tj2psZHDleCYkfeh7b5Vg==
|
integrity sha512-J9/aSU9/YwiRU/avkSN1APYPs9sYVyrzaMpfq7XIY8xMFC4buwrPzCymrqshSOLbn1Qzr9Ruavcqx5Bwt0EuRg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-error" "^1.0.0"
|
"@swagger-api/apidom-error" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-json-schema-draft-4" "^1.0.0"
|
"@swagger-api/apidom-ns-json-schema-draft-4" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
ts-mixer "^6.0.4"
|
ts-mixer "^6.0.4"
|
||||||
|
|
||||||
"@swagger-api/apidom-ns-json-schema-draft-7@^1.0.0":
|
"@swagger-api/apidom-ns-json-schema-draft-7@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.0.tgz#72c10cb4852b98fa0d9930b2dc4b50e92483f11f"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.1.tgz#a89704289dc1507075e15d159d4dfc73a8f01561"
|
||||||
integrity sha512-Lo5QqO831IuMKyuYO5gJVttu/fqsvj66JaSyi4/2KC8srn81yQ9HEi1ousiWVGE0dGuRjGZSr3H2J9fxqbnfTA==
|
integrity sha512-b8pNff3epzweot5Edoa05mM/jBMgvjqajvNTOvOa8SNPWHWLjSJNYkBT2jI3BnFqqEMMo7litEfKnblblFuDtQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-error" "^1.0.0"
|
"@swagger-api/apidom-error" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-json-schema-draft-6" "^1.0.0"
|
"@swagger-api/apidom-ns-json-schema-draft-6" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
ts-mixer "^6.0.4"
|
ts-mixer "^6.0.4"
|
||||||
|
|
||||||
"@swagger-api/apidom-ns-openapi-2@^1.0.0", "@swagger-api/apidom-ns-openapi-2@^1.0.0-rc.0":
|
"@swagger-api/apidom-ns-openapi-2@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.0.tgz#12df7b312d9e428529edc1128a1665a33edb0641"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.1.tgz#5136d8f22065b1dde6cd31da1a22cb7f9a206559"
|
||||||
integrity sha512-vaEcRti1An4y9jXaHmkEMd/TQlfcJAEq/SLhDoGWIsTb3sdUovdVVY7QAvQzbX7VCoQeRATfUgMnj29wggbE6g==
|
integrity sha512-XZ1xHHvsZZaNNHkqk0KWggZxMM2Av5eJdjbxwLij7TFWjodYVJAMZLyWG15llDBjnTXQYtpFIVLGjndf2oC7Xg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-error" "^1.0.0"
|
"@swagger-api/apidom-error" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-json-schema-draft-4" "^1.0.0"
|
"@swagger-api/apidom-ns-json-schema-draft-4" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
ts-mixer "^6.0.3"
|
ts-mixer "^6.0.3"
|
||||||
|
|
||||||
"@swagger-api/apidom-ns-openapi-3-0@^1.0.0", "@swagger-api/apidom-ns-openapi-3-0@^1.0.0-rc.0":
|
"@swagger-api/apidom-ns-openapi-3-0@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.0.tgz#777cc0c106621099b971edbc1283a9ad15672e75"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.1.tgz#6bd7e4e295b57072a7b47f237bcb54d8adc03951"
|
||||||
integrity sha512-ppBGVheaboTC23LOO+5//C45DDyoda88yFeVxh7Lfqn7HM7D0BSs76tFwr7EUtkEE6vw8tQiwc0Ql6Jk/jmUCQ==
|
integrity sha512-BAypZcl8NO+jYpAmAXJVCLVe4f+v3ZoZN21Oxu03N2lsv+qz/P9vpl+6C0dOfta6X8fACkuGr4KIGU6leUPpJg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-error" "^1.0.0"
|
"@swagger-api/apidom-error" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-json-schema-draft-4" "^1.0.0"
|
"@swagger-api/apidom-ns-json-schema-draft-4" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
ts-mixer "^6.0.3"
|
ts-mixer "^6.0.3"
|
||||||
|
|
||||||
"@swagger-api/apidom-ns-openapi-3-1@^1.0.0", "@swagger-api/apidom-ns-openapi-3-1@^1.0.0-rc.0", "@swagger-api/apidom-ns-openapi-3-1@^1.0.0-rc.1":
|
"@swagger-api/apidom-ns-openapi-3-1@^1.0.0-rc.1", "@swagger-api/apidom-ns-openapi-3-1@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.0.tgz#f331749eae22de680c2b75b304735e6e6b0a2ebc"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.1.tgz#69b9ac2a4483b53a8959d41b3927746a95eabd17"
|
||||||
integrity sha512-iDocUU+y214ZdcPrBHng97EnCzEIFJ/2eZsxQRSDQTZuAECI53jmVH6KdJUh/1nc3IW5nQczhf3K9cCYdIcY9g==
|
integrity sha512-nIkgyIW8XTV+zjzLKxP1JaA/lpgmtsRBLshh1mL+Fspd+RYAhyMpRDRNvBOmkIhva9Dst9LNYyMjBP9ssfKUwg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-ast" "^1.0.0"
|
"@swagger-api/apidom-ast" "^1.0.1"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-json-pointer" "^1.0.0"
|
"@swagger-api/apidom-json-pointer" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-json-schema-2020-12" "^1.0.0"
|
"@swagger-api/apidom-ns-json-schema-2020-12" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-openapi-3-0" "^1.0.0"
|
"@swagger-api/apidom-ns-openapi-3-0" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
ts-mixer "^6.0.3"
|
ts-mixer "^6.0.3"
|
||||||
|
|
||||||
"@swagger-api/apidom-parser-adapter-api-design-systems-json@^1.0.0-rc.0":
|
"@swagger-api/apidom-parser-adapter-api-design-systems-json@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.0.tgz#85cef9295d4d33b527ae92ced17fdd39c62bacf9"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.1.tgz#e8a44718e47864d63592fd66f5a8341f83b7cf6f"
|
||||||
integrity sha512-zzEr6VeS5renKsqzT2bRqWntzE/uJA+GRc/cDwHkbq7rF5rWCBxYmECQ1CZzargrznMeYRg5Kvcg3t9NBwI3Tg==
|
integrity sha512-Udj6vJ6Au+fcqZJZtgHlUi1Y/ImLHo8fx4ICSas7hewA7z1/eZ7Y3Yp8YSGZ7ZwqXHS6nnm5fBHws0DgAplnDA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-api-design-systems" "^1.0.0"
|
"@swagger-api/apidom-ns-api-design-systems" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-json" "^1.0.0"
|
"@swagger-api/apidom-parser-adapter-json" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
|
|
||||||
"@swagger-api/apidom-parser-adapter-api-design-systems-yaml@^1.0.0-rc.0":
|
"@swagger-api/apidom-parser-adapter-api-design-systems-yaml@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.0.tgz#048d60b4c5b6e3eddf955446126ba4478016e925"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.1.tgz#bab591fb5270577e97ecb441e37b7d8e4b2cd291"
|
||||||
integrity sha512-/2JG7r3Ok4XAaMtlLTew8y1fVh1BI2jZuVV26QvJAvIcVXhv2Y2+gq9olZUTt1kXqmTx14JOlvxUrg+q/f+EMw==
|
integrity sha512-YZ2IuTEzUGXRF8oFuHHGZpM15hRnSI/rZnweGT984bX53HXi1NFpZdNxOz49vmkhFz6XJgxRXp1R3EDN/98urg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-api-design-systems" "^1.0.0"
|
"@swagger-api/apidom-ns-api-design-systems" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^1.0.0"
|
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
|
|
||||||
"@swagger-api/apidom-parser-adapter-arazzo-json-1@^1.0.0-rc.0":
|
"@swagger-api/apidom-parser-adapter-arazzo-json-1@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.0.0.tgz#381cf347bd07c4829896363db9827b70eb0e2c59"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.0.1.tgz#356876a1262975e78619ad02f51fbe6d117ef0a5"
|
||||||
integrity sha512-uS4N1uTbYsgsr9HW3mhwfjPm2qsVN16cL/YB6/j94e30KYVeUwwXEA5c+xE6weAtCqweTTVTBWCGHtTH+PYxSA==
|
integrity sha512-Re8EcgYOITyTXvGeJyE/4ZNsprkSrkXVmHzyM9hqTWoMpDILnqOtbrjc0YwLkbe9awBkUMWJ51CEFLYALSYfDA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-arazzo-1" "^1.0.0"
|
"@swagger-api/apidom-ns-arazzo-1" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-json" "^1.0.0"
|
"@swagger-api/apidom-parser-adapter-json" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
|
|
||||||
"@swagger-api/apidom-parser-adapter-arazzo-yaml-1@^1.0.0-rc.0":
|
"@swagger-api/apidom-parser-adapter-arazzo-yaml-1@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.0.0.tgz#7c61f46373b526be1f389839d862a6804acd407f"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.0.1.tgz#0365c0db8cb5c68fc622cf540072a72d33bfa4d4"
|
||||||
integrity sha512-D23g2/VBbI/SSFIxabjBqcxtoHjR+Z3A2Lp1slFixgwlmd9viQQuQI9p5EdVbXSlLU4aGPocfydOfJ5Sl7nfoA==
|
integrity sha512-++BB47Vf9sarAf+YCvlt9V2OqFd8O5AZMr/xXBKTls4SzwpUcLf4oIQJpHcr/rl+bgI4CKwxKXHvnhg2vhEVmg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-arazzo-1" "^1.0.0"
|
"@swagger-api/apidom-ns-arazzo-1" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^1.0.0"
|
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
|
|
||||||
"@swagger-api/apidom-parser-adapter-asyncapi-json-2@^1.0.0-rc.0":
|
"@swagger-api/apidom-parser-adapter-asyncapi-json-2@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.0.tgz#892a2a0d4b3ddee57d449971abcd065c58b14872"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.1.tgz#209a61c29919b41c820f88beb116bbfbc9a3718f"
|
||||||
integrity sha512-edOFXHrOl1xLRn/i2yVZKJ1+A7YUZ9WyVnIyEedb+L4uFKxDnArNZhi10R3Is6vWKX1GAlH1Uw8xmqYyG7KVQg==
|
integrity sha512-dd8djfZy2utM1xO7oxDPB/dmExSFgEA2l71gjHaKmhJw7O5NB8E/1663w9lD4NElj2Ft8kuGLLDsqyKNhXW/9w==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-asyncapi-2" "^1.0.0"
|
"@swagger-api/apidom-ns-asyncapi-2" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-json" "^1.0.0"
|
"@swagger-api/apidom-parser-adapter-json" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
|
|
||||||
"@swagger-api/apidom-parser-adapter-asyncapi-json-3@^1.0.0-rc.0":
|
"@swagger-api/apidom-parser-adapter-asyncapi-json-3@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-asyncapi-json-3/-/apidom-parser-adapter-asyncapi-json-3-1.0.0.tgz#c1546faa35887d78c89ed926cd8c3c9d8db90b69"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-asyncapi-json-3/-/apidom-parser-adapter-asyncapi-json-3-1.0.1.tgz#fc461058fe16e2ca6f142fcfe92c39979bd57614"
|
||||||
integrity sha512-elGrI0b2wyLVN7UKOsg8GNgzidBtIvBWjKyJvt1oy/ZTvLZ+I5wgD9KENfMRtLCdMtWAv8HSyB094nvlhqP/iw==
|
integrity sha512-qD+gbnSnc9PlZ8b45knyWihrWOMKhnAHDnvzRllX+NiyM3XdBJ7B6yLn8dl6gZuKjTBHoMORLEefoTGvmskneA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-asyncapi-3" "^1.0.0"
|
"@swagger-api/apidom-ns-asyncapi-3" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-json" "^1.0.0"
|
"@swagger-api/apidom-parser-adapter-json" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
|
|
||||||
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@^1.0.0-rc.0":
|
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.0.tgz#0fb2813797af04d3920fb8f6e9ad85982230603e"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.1.tgz#da0ba765800430ca9ba832b52d50853799031321"
|
||||||
integrity sha512-cP58L+QR2qFIpe4I4oOT5QShmXYts20/N9GrxfmeebmNiu0RCrO8yomyzKbtLMX4DWZIOjXfm96i20FmdNtxxA==
|
integrity sha512-G5RS0pCFCOIsFflKvWbH+DblunmcAdVi5X9ETTTkGLa1IF5s0DIdjU46WxJAzEQpCXOvmUhpDspjaAYXxGTYpQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-asyncapi-2" "^1.0.0"
|
"@swagger-api/apidom-ns-asyncapi-2" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^1.0.0"
|
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
|
|
||||||
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@^1.0.0-rc.0":
|
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-asyncapi-yaml-3/-/apidom-parser-adapter-asyncapi-yaml-3-1.0.0.tgz#fee8abb31532fb8839ea457f3628cbcf4b9fe1e0"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-asyncapi-yaml-3/-/apidom-parser-adapter-asyncapi-yaml-3-1.0.1.tgz#72e8410fc3e3e38a8c76d5e5f107e2d340ba0bd7"
|
||||||
integrity sha512-5kVZQ7SI0TvkHNCAr0fAz+FMj+Py8ILW8MbWTbJPPzpcfiBa8wb33xbCrO3aQoXSKL4S3J/a+iDFyrzQgBRlRQ==
|
integrity sha512-hzgUkTsuKYraY0NXQlaYe/j1/LkvNF/8r30Iz7/1B27BYLOKIwHoFGN6jUa8UBA9/0qSp8QPzSwVWFLrgNiqJQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-asyncapi-3" "^1.0.0"
|
"@swagger-api/apidom-ns-asyncapi-3" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^1.0.0"
|
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
|
|
||||||
"@swagger-api/apidom-parser-adapter-json@^1.0.0", "@swagger-api/apidom-parser-adapter-json@^1.0.0-rc.0":
|
"@swagger-api/apidom-parser-adapter-json@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.0.tgz#4812a08d906c80bda1f8aa4379455065eb0c474c"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.1.tgz#4e3aec8e6ac210cd4fe731749c9fa8b85ca95b9d"
|
||||||
integrity sha512-+zaH4MX1/JiSP3bQe1WE2CRsmXLSCPF3zMtvyFhPNtPgIIWqHJg1P4zPXy528m3DH/QqagfXIslk4RpDWStyxA==
|
integrity sha512-95V2aMBGZ76rYXcod/PCJpVEMK+9mPk/gDgsDKEq2ka+YVMTtR1tUkPUIBmWlNC+brh5reks1QocyQL8B4f3TQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-ast" "^1.0.0"
|
"@swagger-api/apidom-ast" "^1.0.1"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-error" "^1.0.0"
|
"@swagger-api/apidom-error" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
@@ -1857,93 +1857,93 @@
|
|||||||
tree-sitter-json "=0.24.8"
|
tree-sitter-json "=0.24.8"
|
||||||
web-tree-sitter "=0.24.5"
|
web-tree-sitter "=0.24.5"
|
||||||
|
|
||||||
"@swagger-api/apidom-parser-adapter-openapi-json-2@^1.0.0-rc.0":
|
"@swagger-api/apidom-parser-adapter-openapi-json-2@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.0.tgz#18f2b9a8c11e1a936184a6fddc3c7ad93fd4662b"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.1.tgz#a411d048eed1543fedf1b48e5ac2bb96309b2efb"
|
||||||
integrity sha512-rm/wotLRSz1JqTdQKwxydC8MnRLgb8VvtNgWgSWHDHChcgFQmimxVya7dmivy1YywcczK9G0cNcR10o4ebI/vw==
|
integrity sha512-Gp02eAA32SN+hAgVDc82xpkUthHn0oAdLdri5g3co4pa45XVRsBSHS3L/H3NEbhDJ8wpXjcg+FLs/OAwcm42yw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-openapi-2" "^1.0.0"
|
"@swagger-api/apidom-ns-openapi-2" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-json" "^1.0.0"
|
"@swagger-api/apidom-parser-adapter-json" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
|
|
||||||
"@swagger-api/apidom-parser-adapter-openapi-json-3-0@^1.0.0-rc.0":
|
"@swagger-api/apidom-parser-adapter-openapi-json-3-0@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.0.tgz#270d11f3115874b9eedf026c1e0c0dc04d4ac50a"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.1.tgz#b4b290356c719d5eed870214ff0b3e9dc4716751"
|
||||||
integrity sha512-leLf9tC7wCzOaL+oiK8CyLTNTf9+xupfHY+6nzWzJrYiq9yI5nJUM/yr38+Bq5cupA+gDWHl59b32bc/jV+iuQ==
|
integrity sha512-Ls3U0stAtMqvzesy981crjDa7vwqGHlCoulHIsWQ/V74dHg3Nl1Vg9AgerefKg8LHxxLiYTZJITfsWQMYsnlkA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-openapi-3-0" "^1.0.0"
|
"@swagger-api/apidom-ns-openapi-3-0" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-json" "^1.0.0"
|
"@swagger-api/apidom-parser-adapter-json" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
|
|
||||||
"@swagger-api/apidom-parser-adapter-openapi-json-3-1@^1.0.0-rc.0":
|
"@swagger-api/apidom-parser-adapter-openapi-json-3-1@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.0.tgz#57c6bb2dab1d036ac0346a7fffc1ac96997a13db"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.1.tgz#8390d00d97a514cf59bc99b34329394ac25208be"
|
||||||
integrity sha512-GDf2IlEMhAPlHUWd1f6/cpP8V2k7e2dPaVS7e7baK5djGSwcGHZEUotqyDkA01Vnhf2DPGfmb6rkvg4dQ/1ChA==
|
integrity sha512-Xsf3jUCfgqZqZjiABWifPynBDLPkW54V210Oa4SvgyI7ZWgubcy5/Wgd68wvhq4knauRXqRmbgKc+WRm0UP3xw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-openapi-3-1" "^1.0.0"
|
"@swagger-api/apidom-ns-openapi-3-1" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-json" "^1.0.0"
|
"@swagger-api/apidom-parser-adapter-json" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
|
|
||||||
"@swagger-api/apidom-parser-adapter-openapi-yaml-2@^1.0.0-rc.0":
|
"@swagger-api/apidom-parser-adapter-openapi-yaml-2@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.0.tgz#62cf0b68d498cd1717b4dd841f8b424fdd37cccf"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.1.tgz#cb8e1cf61536cf2dfb05e84e717eb63051b91c48"
|
||||||
integrity sha512-pYkMetJatd12Cplau9u7MAQYJOJSjs0iuWGzvzG6IkTTNY673aQVxsmdTJK6Mt6sEkG3LK5OOCIqlW63GdtMuQ==
|
integrity sha512-SygtOXG9XF6lYveg6rymk4u1Twgk1VTxzyVkQ8I6eQoGyBoYfJC00sI6qep9bGU/VnsaRaN/H8+N0vXBeAOsPg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-openapi-2" "^1.0.0"
|
"@swagger-api/apidom-ns-openapi-2" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^1.0.0"
|
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
|
|
||||||
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@^1.0.0-rc.0":
|
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.0.tgz#f5a056b73622e5dc116ad4d74ec4e0874e0a4773"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.1.tgz#b062075960c17d4a29da58df5f08bcdad5d71988"
|
||||||
integrity sha512-iabLypsj+ygEozgTjBi0zu8VgRjq2VKUFxyNo6lVYjLg4PIvnwem3S8GU3iDmEdEqZTBmTQCOnzdbbw+tEm70Q==
|
integrity sha512-xm8tY1NYe329tGF01WCtCi7uepppORWs3WpwzskSiZnDAmyjIu5ez3R0RFPCiXnMRGgj4wO6UzjawSrKGTJHjA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-openapi-3-0" "^1.0.0"
|
"@swagger-api/apidom-ns-openapi-3-0" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^1.0.0"
|
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
|
|
||||||
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@^1.0.0-rc.0":
|
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.0.tgz#d8efeb147a11697c0df62c4313da9edf757c3562"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.1.tgz#945e7e3408f932de04fabc94c347b42b8bc804c0"
|
||||||
integrity sha512-cmx5MC6nC5KBFxZxmFRwcDW9CPLTAZglYvtLh2ILoMBvYS+ht9WUknTqZFIVVCK/l7wAz8ftOtCrnjb7U143yQ==
|
integrity sha512-p0G3g63Jcd4Z5Y2hStNB0NgjwYJg9VBLhkDcmFdmKCbz9vYA45rMN+wn62pqkWQE7KBZ1F1zY0wacRlUy0VuuQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-openapi-3-1" "^1.0.0"
|
"@swagger-api/apidom-ns-openapi-3-1" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^1.0.0"
|
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
|
|
||||||
"@swagger-api/apidom-parser-adapter-yaml-1-2@^1.0.0", "@swagger-api/apidom-parser-adapter-yaml-1-2@^1.0.0-rc.0":
|
"@swagger-api/apidom-parser-adapter-yaml-1-2@^1.0.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.0.tgz#f25c45a7b7c0f91ab01cd8fa0b3d0d52c256036c"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.1.tgz#2eaf730ca506a3387a02203d3192c6d5c01c77f1"
|
||||||
integrity sha512-of/vKMaK5e36kwJrhBRvnrpIC9tikUuhpzSMfzckx/58p1H66oHrzdGrRbQxcy1l/HaylJNIn1YvWlaNJVjNcQ==
|
integrity sha512-ppNo8mncbGA3TchroLmcDv1WUw9vruHa4M96WbWqI7cwH3zdJ1UddwfHkZ5IaCOUU08Iyo2uzMMRaarALAsl8g==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-ast" "^1.0.0"
|
"@swagger-api/apidom-ast" "^1.0.1"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-error" "^1.0.0"
|
"@swagger-api/apidom-error" "^1.0.1"
|
||||||
"@tree-sitter-grammars/tree-sitter-yaml" "=0.7.1"
|
"@tree-sitter-grammars/tree-sitter-yaml" "=0.7.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
@@ -1952,13 +1952,13 @@
|
|||||||
web-tree-sitter "=0.24.5"
|
web-tree-sitter "=0.24.5"
|
||||||
|
|
||||||
"@swagger-api/apidom-reference@^1.0.0-rc.1":
|
"@swagger-api/apidom-reference@^1.0.0-rc.1":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-reference/-/apidom-reference-1.0.0.tgz#95a30e36446f04989c8c7a168d7bcf59abcb8636"
|
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-reference/-/apidom-reference-1.0.1.tgz#bcf9784e1a82a084f31ac3d8d5d88599648282ba"
|
||||||
integrity sha512-pT225Muf5pYMaQjyoJ/8+OJuAAvWOLJih2P8ho0EE6pIw4D0Uz9Hq8cODdwBXEr5mOTAwntNDDcPP+FoTfYnyg==
|
integrity sha512-FvM6cooFx1ppWN9gKXSLFG2Y4u3SRdv1FIJxj+5VC/6V3++BF2LUFkb7hK0IOaAjw2vQ7G0NUyP+5UY/3qKBjA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs3" "^7.26.10"
|
"@babel/runtime-corejs3" "^7.26.10"
|
||||||
"@swagger-api/apidom-core" "^1.0.0"
|
"@swagger-api/apidom-core" "^1.0.1"
|
||||||
"@swagger-api/apidom-error" "^1.0.0"
|
"@swagger-api/apidom-error" "^1.0.1"
|
||||||
"@types/ramda" "~0.30.0"
|
"@types/ramda" "~0.30.0"
|
||||||
axios "^1.12.2"
|
axios "^1.12.2"
|
||||||
minimatch "^7.4.3"
|
minimatch "^7.4.3"
|
||||||
@@ -1966,28 +1966,28 @@
|
|||||||
ramda "~0.30.0"
|
ramda "~0.30.0"
|
||||||
ramda-adjunct "^5.0.0"
|
ramda-adjunct "^5.0.0"
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
"@swagger-api/apidom-json-pointer" "^1.0.0-rc.0"
|
"@swagger-api/apidom-json-pointer" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-arazzo-1" "^1.0.0-rc.0"
|
"@swagger-api/apidom-ns-arazzo-1" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-asyncapi-2" "^1.0.0-rc.0"
|
"@swagger-api/apidom-ns-asyncapi-2" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-openapi-2" "^1.0.0-rc.0"
|
"@swagger-api/apidom-ns-openapi-2" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-openapi-3-0" "^1.0.0-rc.0"
|
"@swagger-api/apidom-ns-openapi-3-0" "^1.0.1"
|
||||||
"@swagger-api/apidom-ns-openapi-3-1" "^1.0.0-rc.0"
|
"@swagger-api/apidom-ns-openapi-3-1" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-api-design-systems-json" "^1.0.0-rc.0"
|
"@swagger-api/apidom-parser-adapter-api-design-systems-json" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-api-design-systems-yaml" "^1.0.0-rc.0"
|
"@swagger-api/apidom-parser-adapter-api-design-systems-yaml" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-arazzo-json-1" "^1.0.0-rc.0"
|
"@swagger-api/apidom-parser-adapter-arazzo-json-1" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-arazzo-yaml-1" "^1.0.0-rc.0"
|
"@swagger-api/apidom-parser-adapter-arazzo-yaml-1" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-asyncapi-json-2" "^1.0.0-rc.0"
|
"@swagger-api/apidom-parser-adapter-asyncapi-json-2" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-asyncapi-json-3" "^1.0.0-rc.0"
|
"@swagger-api/apidom-parser-adapter-asyncapi-json-3" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2" "^1.0.0-rc.0"
|
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-3" "^1.0.0-rc.0"
|
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-3" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-json" "^1.0.0-rc.0"
|
"@swagger-api/apidom-parser-adapter-json" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-openapi-json-2" "^1.0.0-rc.0"
|
"@swagger-api/apidom-parser-adapter-openapi-json-2" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-openapi-json-3-0" "^1.0.0-rc.0"
|
"@swagger-api/apidom-parser-adapter-openapi-json-3-0" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-openapi-json-3-1" "^1.0.0-rc.0"
|
"@swagger-api/apidom-parser-adapter-openapi-json-3-1" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-openapi-yaml-2" "^1.0.0-rc.0"
|
"@swagger-api/apidom-parser-adapter-openapi-yaml-2" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0" "^1.0.0-rc.0"
|
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1" "^1.0.0-rc.0"
|
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1" "^1.0.1"
|
||||||
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^1.0.0-rc.0"
|
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^1.0.1"
|
||||||
|
|
||||||
"@swaggerexpert/cookie@^2.0.2":
|
"@swaggerexpert/cookie@^2.0.2":
|
||||||
version "2.0.2"
|
version "2.0.2"
|
||||||
@@ -2511,9 +2511,9 @@ base64-js@^1.3.1:
|
|||||||
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
|
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
|
||||||
|
|
||||||
baseline-browser-mapping@^2.9.0:
|
baseline-browser-mapping@^2.9.0:
|
||||||
version "2.9.2"
|
version "2.9.5"
|
||||||
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.2.tgz#0ae89ec3e10e07c368b77def89db8044409461d1"
|
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.5.tgz#47f9549e0be1a84cd16651ac4c3b7d87a71408e6"
|
||||||
integrity sha512-PxSsosKQjI38iXkmb3d0Y32efqyA0uW4s41u4IVBsLlWLhCiYNpH/AfNOVWRqCQBlD8TFJTz6OUWNd4DFJCnmw==
|
integrity sha512-D5vIoztZOq1XM54LUdttJVc96ggEsIfju2JBvht06pSzpckp3C7HReun67Bghzrtdsq9XdMGbSSB3v3GhMNmAA==
|
||||||
|
|
||||||
body-parser@^2.2.1:
|
body-parser@^2.2.1:
|
||||||
version "2.2.1"
|
version "2.2.1"
|
||||||
@@ -4025,10 +4025,10 @@ lru-cache@^5.1.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
yallist "^3.0.2"
|
yallist "^3.0.2"
|
||||||
|
|
||||||
lucide-react@^0.555.0:
|
lucide-react@^0.556.0:
|
||||||
version "0.555.0"
|
version "0.556.0"
|
||||||
resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.555.0.tgz#8db4322b784e0d14a415d67ee0e8ca219a1714ca"
|
resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.556.0.tgz#aad61a065737aef30322695a11fd21c7542c71aa"
|
||||||
integrity sha512-D8FvHUGbxWBRQM90NZeIyhAvkFfsh3u9ekrMvJ30Z6gnpBHS6HC6ldLg7tL45hwiIz/u66eKDtdA23gwwGsAHA==
|
integrity sha512-iOb8dRk7kLaYBZhR2VlV1CeJGxChBgUthpSP8wom9jfj79qovgG6qcSdiy6vkoREKPnbUYzJsCn4o4PtG3Iy+A==
|
||||||
|
|
||||||
magic-string@^0.30.21:
|
magic-string@^0.30.21:
|
||||||
version "0.30.21"
|
version "0.30.21"
|
||||||
@@ -4606,9 +4606,9 @@ raw-body@^3.0.0, raw-body@^3.0.1:
|
|||||||
unpipe "~1.0.0"
|
unpipe "~1.0.0"
|
||||||
|
|
||||||
react-day-picker@^9.11.3:
|
react-day-picker@^9.11.3:
|
||||||
version "9.11.3"
|
version "9.12.0"
|
||||||
resolved "https://registry.yarnpkg.com/react-day-picker/-/react-day-picker-9.11.3.tgz#ef88cece2512c3e3c9ca0ce067871f62072cd943"
|
resolved "https://registry.yarnpkg.com/react-day-picker/-/react-day-picker-9.12.0.tgz#f1251c80aa2f932069b1854eeb1fc0ae4dae5ac6"
|
||||||
integrity sha512-7lD12UvGbkyXqgzbYIGQTbl+x29B9bAf+k0pP5Dcs1evfpKk6zv4EdH/edNc8NxcmCiTNXr2HIYPrSZ3XvmVBg==
|
integrity sha512-t8OvG/Zrciso5CQJu5b1A7yzEmebvST+S3pOVQJWxwjjVngyG/CA2htN/D15dLI4uTEuLLkbZyS4YYt480FAtA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@date-fns/tz" "^1.4.1"
|
"@date-fns/tz" "^1.4.1"
|
||||||
date-fns "^4.1.0"
|
date-fns "^4.1.0"
|
||||||
@@ -5271,9 +5271,9 @@ type-check@^0.4.0, type-check@~0.4.0:
|
|||||||
prelude-ls "^1.2.1"
|
prelude-ls "^1.2.1"
|
||||||
|
|
||||||
type-fest@^5.2.0:
|
type-fest@^5.2.0:
|
||||||
version "5.3.0"
|
version "5.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-5.3.0.tgz#9422125b3094b1087d8446ba151b72fb9f39411a"
|
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-5.3.1.tgz#251b8d0a813c1dbccf1f9450ba5adcdf7072adc2"
|
||||||
integrity sha512-d9CwU93nN0IA1QL+GSNDdwLAu1Ew5ZjTwupvedwg3WdfoH6pIDvYQ2hV0Uc2nKBLPq7NB5apCx57MLS5qlmO5g==
|
integrity sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg==
|
||||||
dependencies:
|
dependencies:
|
||||||
tagged-tag "^1.0.0"
|
tagged-tag "^1.0.0"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user