Create an env using api
This commit is contained in:
@ -47,13 +47,13 @@ func (acc *Account) Create(ctx context.Context) error {
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: acc.Data.UUID,
|
||||
Labels: map[string]string{
|
||||
"username": acc.Data.Username,
|
||||
"username": acc.Data.Username,
|
||||
"email-verified": "false",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
if err := kube.Create(ctx,client, namespace, true); err != nil {
|
||||
|
||||
if err := kube.Create(ctx, client, namespace, true); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@ -85,7 +85,7 @@ func (acc *Account) Create(ctx context.Context) error {
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
// Prepare RBAC resources for the account
|
||||
role := &rbacv1.Role{
|
||||
ObjectMeta: metav1.ObjectMeta{Name: acc.Data.Username, Namespace: acc.Data.UUID},
|
||||
@ -105,7 +105,7 @@ func (acc *Account) Create(ctx context.Context) error {
|
||||
Namespace: acc.Data.UUID,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
if err := client.Create(ctx, sa); err != nil {
|
||||
if err := client.Delete(ctx, namespace); err != nil {
|
||||
return err
|
||||
@ -113,7 +113,6 @@ func (acc *Account) Create(ctx context.Context) error {
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
rb := &rbacv1.RoleBinding{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: acc.Data.UUID,
|
||||
|
@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
"crypto/rand"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
|
||||
@ -17,21 +18,22 @@ import (
|
||||
)
|
||||
|
||||
type EmailSvc struct {
|
||||
Controller ctrl.Manager
|
||||
Data EmailData
|
||||
EmailConfig email.EmailConf
|
||||
Controller ctrl.Manager
|
||||
Data EmailData
|
||||
EmailConfig email.EmailConf
|
||||
DevMode bool
|
||||
}
|
||||
|
||||
type EmailData struct {
|
||||
UserID string
|
||||
Code string
|
||||
Code string
|
||||
}
|
||||
|
||||
func (svc *EmailSvc) SendVerification(ctx context.Context) error {
|
||||
client := svc.Controller.GetClient()
|
||||
client := svc.Controller.GetClient()
|
||||
userns := &corev1.Namespace{}
|
||||
if err := client.Get(ctx, types.NamespacedName{
|
||||
Name: svc.Data.UserID,
|
||||
Name: svc.Data.UserID,
|
||||
}, userns); err != nil {
|
||||
return err
|
||||
}
|
||||
@ -48,17 +50,20 @@ func (svc *EmailSvc) SendVerification(ctx context.Context) error {
|
||||
return err
|
||||
}
|
||||
number := encodeToString(6)
|
||||
email := string(accountData.Data["email"])
|
||||
if err := svc.EmailConfig.SendEmail(email, number); err != nil {
|
||||
return err
|
||||
svc.Data.Code = number
|
||||
if !svc.DevMode {
|
||||
emailContent := "Subject: Softplayer verification code\r\n" + "\r\n" + fmt.Sprintf("Your verification code is %s", number)
|
||||
email := string(accountData.Data["email"])
|
||||
if err := svc.EmailConfig.SendEmail(email, emailContent); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
emailCode := corev1.ConfigMap{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: "email-verification-code",
|
||||
Namespace: svc.Data.UserID,
|
||||
Name: "email-verification-code",
|
||||
Namespace: svc.Data.UserID,
|
||||
},
|
||||
Data: map[string]string{
|
||||
Data: map[string]string{
|
||||
"code": number,
|
||||
},
|
||||
}
|
||||
@ -66,7 +71,7 @@ func (svc *EmailSvc) SendVerification(ctx context.Context) error {
|
||||
if err := kube.Create(ctx, client, &emailCode, true); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
return nil
|
||||
}
|
||||
|
||||
func (svc *EmailSvc) ConfirmVerification(ctx context.Context) error {
|
||||
@ -74,7 +79,7 @@ func (svc *EmailSvc) ConfirmVerification(ctx context.Context) error {
|
||||
emailCode := &corev1.ConfigMap{}
|
||||
if err := client.Get(ctx, types.NamespacedName{
|
||||
Namespace: svc.Data.UserID,
|
||||
Name: "email-verification-code",
|
||||
Name: "email-verification-code",
|
||||
}, emailCode); err != nil {
|
||||
return err
|
||||
}
|
||||
@ -90,10 +95,11 @@ func (svc *EmailSvc) ConfirmVerification(ctx context.Context) error {
|
||||
|
||||
userns := &corev1.Namespace{}
|
||||
if err := client.Get(ctx, types.NamespacedName{
|
||||
Name: svc.Data.UserID,
|
||||
Name: svc.Data.UserID,
|
||||
}, userns); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
userns.Labels["email-verified"] = "true"
|
||||
if err := client.Update(ctx, userns); err != nil {
|
||||
return err
|
||||
@ -102,15 +108,15 @@ func (svc *EmailSvc) ConfirmVerification(ctx context.Context) error {
|
||||
}
|
||||
|
||||
func encodeToString(max int) string {
|
||||
b := make([]byte, max)
|
||||
n, err := io.ReadAtLeast(rand.Reader, b, max)
|
||||
if n != max {
|
||||
panic(err)
|
||||
}
|
||||
for i := 0; i < len(b); i++ {
|
||||
b[i] = table[int(b[i])%len(table)]
|
||||
}
|
||||
return string(b)
|
||||
b := make([]byte, max)
|
||||
n, err := io.ReadAtLeast(rand.Reader, b, max)
|
||||
if n != max {
|
||||
panic(err)
|
||||
}
|
||||
for i := 0; i < len(b); i++ {
|
||||
b[i] = table[int(b[i])%len(table)]
|
||||
}
|
||||
return string(b)
|
||||
}
|
||||
|
||||
var table = [...]byte{'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'}
|
||||
|
@ -2,26 +2,104 @@ package controllers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"strings"
|
||||
|
||||
"git.badhouseplants.net/softplayer/softplayer-backend/internal/helpers/kube"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/types"
|
||||
"k8s.io/client-go/rest"
|
||||
ctrl "sigs.k8s.io/controller-runtime"
|
||||
)
|
||||
|
||||
type Environemnt struct {
|
||||
Controller ctrl.Manager
|
||||
UserID string
|
||||
Data *EnvironemntData
|
||||
Token string
|
||||
}
|
||||
|
||||
type EnvironemntData struct {
|
||||
Name string
|
||||
Provider string
|
||||
Name string
|
||||
Provider string
|
||||
Kubernetes string
|
||||
HetznerData HetznerData
|
||||
}
|
||||
|
||||
func (env *Environemnt) Create(ctx context.Context) error {
|
||||
log.Printf("%s", env.Data.Name)
|
||||
log.Printf("%s", env.Data.Provider)
|
||||
type HetznerData struct {
|
||||
ServerLocation string
|
||||
ServerType string
|
||||
}
|
||||
|
||||
func (e *EnvironemntData) buildVars() string {
|
||||
vars := fmt.Sprintf("SP_PROVIDER=%s\nSP_KUBERNETES=%s", e.providerFmt(), e.kubernetesFmt())
|
||||
return vars
|
||||
}
|
||||
|
||||
func (e *EnvironemntData) providerFmt() string {
|
||||
res := strings.Replace(e.Provider, "PROVIDER_", "", -1)
|
||||
return strings.ToLower(res)
|
||||
}
|
||||
|
||||
func (e *EnvironemntData) kubernetesFmt() string {
|
||||
res := strings.Replace(e.Kubernetes, "KUBERNETES", "", -1)
|
||||
return strings.ToLower(res)
|
||||
}
|
||||
|
||||
func (env *Environemnt) isNsVerified(ctx context.Context) error {
|
||||
client := env.Controller.GetClient()
|
||||
ns := &corev1.Namespace{}
|
||||
if err := client.Get(ctx, types.NamespacedName{Name: env.UserID}, ns); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
val, ok := ns.GetLabels()["email-verified"]
|
||||
if !ok || val == "false" {
|
||||
return errors.New("User email is not verified, can't create an new env")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Create environment should create a new configmap in the user's namespace
|
||||
// using a token that belongs to the user.
|
||||
func (env *Environemnt) Create(ctx context.Context) error {
|
||||
if err := env.isNsVerified(ctx); err != nil {
|
||||
log.Println("Can't verify ns")
|
||||
return err
|
||||
}
|
||||
env.Controller.GetClient()
|
||||
conf := &rest.Config{
|
||||
Host: "https://kubernetes.default.svc.cluster.local:443",
|
||||
BearerToken: env.Token,
|
||||
TLSClientConfig: rest.TLSClientConfig{
|
||||
Insecure: true,
|
||||
},
|
||||
}
|
||||
|
||||
controller, err := ctrl.NewManager(conf, ctrl.Options{})
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
obj := corev1.ConfigMap{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: env.Data.Name,
|
||||
Namespace: env.UserID,
|
||||
Labels: map[string]string{
|
||||
"component": "bootstrap",
|
||||
},
|
||||
},
|
||||
Data: map[string]string{
|
||||
"vars": env.Data.buildVars(),
|
||||
},
|
||||
}
|
||||
if err := kube.Create(ctx, controller.GetClient(), &obj, false); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Create a configmap
|
||||
//
|
||||
return nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user