First commit of golang CLI.
This commit is contained in:
190
wild-cli/cmd/wild/setup/scaffold.go
Normal file
190
wild-cli/cmd/wild/setup/scaffold.go
Normal file
@@ -0,0 +1,190 @@
|
||||
package setup
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/wild-cloud/wild-cli/internal/output"
|
||||
)
|
||||
|
||||
func newScaffoldCommand() *cobra.Command {
|
||||
return &cobra.Command{
|
||||
Use: "scaffold",
|
||||
Short: "Initialize a new Wild Cloud project",
|
||||
Long: `Initialize a new Wild Cloud project directory with configuration templates.`,
|
||||
RunE: runScaffold,
|
||||
}
|
||||
}
|
||||
|
||||
func runScaffold(cmd *cobra.Command, args []string) error {
|
||||
output.Header("Wild Cloud Project Initialization")
|
||||
|
||||
// Get current directory
|
||||
cwd, err := os.Getwd()
|
||||
if err != nil {
|
||||
return fmt.Errorf("getting current directory: %w", err)
|
||||
}
|
||||
|
||||
// Check if already a Wild Cloud project
|
||||
if _, err := os.Stat(filepath.Join(cwd, ".wildcloud")); err == nil {
|
||||
return fmt.Errorf("current directory is already a Wild Cloud project")
|
||||
}
|
||||
|
||||
output.Info("Initializing Wild Cloud project in: " + cwd)
|
||||
|
||||
// Create .wildcloud directory
|
||||
wildcloudDir := filepath.Join(cwd, ".wildcloud")
|
||||
if err := os.MkdirAll(wildcloudDir, 0755); err != nil {
|
||||
return fmt.Errorf("creating .wildcloud directory: %w", err)
|
||||
}
|
||||
|
||||
// Create cache directory
|
||||
cacheDir := filepath.Join(wildcloudDir, "cache")
|
||||
if err := os.MkdirAll(cacheDir, 0755); err != nil {
|
||||
return fmt.Errorf("creating cache directory: %w", err)
|
||||
}
|
||||
|
||||
// Create apps directory
|
||||
appsDir := filepath.Join(cwd, "apps")
|
||||
if err := os.MkdirAll(appsDir, 0755); err != nil {
|
||||
return fmt.Errorf("creating apps directory: %w", err)
|
||||
}
|
||||
|
||||
// Create config.yaml with basic structure
|
||||
configPath := filepath.Join(cwd, "config.yaml")
|
||||
configContent := `# Wild Cloud Configuration
|
||||
cluster:
|
||||
name: ""
|
||||
domain: ""
|
||||
vip: ""
|
||||
nodes: []
|
||||
|
||||
apps: {}
|
||||
|
||||
services: {}
|
||||
`
|
||||
|
||||
if err := os.WriteFile(configPath, []byte(configContent), 0644); err != nil {
|
||||
return fmt.Errorf("creating config.yaml: %w", err)
|
||||
}
|
||||
|
||||
// Create secrets.yaml with basic structure
|
||||
secretsPath := filepath.Join(cwd, "secrets.yaml")
|
||||
secretsContent := `# Wild Cloud Secrets
|
||||
# This file contains sensitive information and should not be committed to version control
|
||||
|
||||
cluster:
|
||||
secrets: {}
|
||||
|
||||
apps: {}
|
||||
`
|
||||
|
||||
if err := os.WriteFile(secretsPath, []byte(secretsContent), 0600); err != nil {
|
||||
return fmt.Errorf("creating secrets.yaml: %w", err)
|
||||
}
|
||||
|
||||
// Create .gitignore to exclude secrets
|
||||
gitignorePath := filepath.Join(cwd, ".gitignore")
|
||||
gitignoreContent := `# Wild Cloud secrets and sensitive data
|
||||
secrets.yaml
|
||||
*.key
|
||||
*.crt
|
||||
*.pem
|
||||
|
||||
# Talos configuration files
|
||||
*.talosconfig
|
||||
controlplane.yaml
|
||||
worker.yaml
|
||||
|
||||
# Kubernetes config
|
||||
kubeconfig
|
||||
|
||||
# Backup files
|
||||
*.bak
|
||||
*.backup
|
||||
|
||||
# Cache and temporary files
|
||||
.wildcloud/cache/
|
||||
*.tmp
|
||||
*.temp
|
||||
`
|
||||
|
||||
if err := os.WriteFile(gitignorePath, []byte(gitignoreContent), 0644); err != nil {
|
||||
output.Warning("Failed to create .gitignore: " + err.Error())
|
||||
}
|
||||
|
||||
// Create README.md with basic information
|
||||
readmePath := filepath.Join(cwd, "README.md")
|
||||
readmeContent := `# Wild Cloud Project
|
||||
|
||||
This is a Wild Cloud personal infrastructure project.
|
||||
|
||||
## Getting Started
|
||||
|
||||
1. Configure your cluster settings:
|
||||
` + "```bash" + `
|
||||
wild config set cluster.name my-cluster
|
||||
wild config set cluster.domain example.com
|
||||
wild config set cluster.vip 192.168.1.100
|
||||
` + "```" + `
|
||||
|
||||
2. Set up your cluster:
|
||||
` + "```bash" + `
|
||||
wild setup cluster
|
||||
` + "```" + `
|
||||
|
||||
3. Install cluster services:
|
||||
` + "```bash" + `
|
||||
wild setup services
|
||||
` + "```" + `
|
||||
|
||||
4. Deploy applications:
|
||||
` + "```bash" + `
|
||||
wild app list
|
||||
wild app fetch nextcloud
|
||||
wild app add nextcloud
|
||||
wild app deploy nextcloud
|
||||
` + "```" + `
|
||||
|
||||
## Directory Structure
|
||||
|
||||
- ` + "`config.yaml`" + ` - Cluster and application configuration
|
||||
- ` + "`secrets.yaml`" + ` - Sensitive data (not committed to git)
|
||||
- ` + "`apps/`" + ` - Application configurations
|
||||
- ` + "`.wildcloud/`" + ` - Wild Cloud metadata and cache
|
||||
|
||||
## Commands
|
||||
|
||||
- ` + "`wild config`" + ` - Manage configuration
|
||||
- ` + "`wild secret`" + ` - Manage secrets
|
||||
- ` + "`wild setup`" + ` - Set up infrastructure
|
||||
- ` + "`wild app`" + ` - Manage applications
|
||||
- ` + "`wild cluster`" + ` - Manage cluster
|
||||
- ` + "`wild backup`" + ` - Backup system
|
||||
|
||||
For more information, run ` + "`wild --help`" + `
|
||||
`
|
||||
|
||||
if err := os.WriteFile(readmePath, []byte(readmeContent), 0644); err != nil {
|
||||
output.Warning("Failed to create README.md: " + err.Error())
|
||||
}
|
||||
|
||||
output.Success("Wild Cloud project initialized successfully!")
|
||||
output.Info("")
|
||||
output.Info("Next steps:")
|
||||
output.Info(" 1. Configure your cluster: wild config set cluster.name my-cluster")
|
||||
output.Info(" 2. Set up your cluster: wild setup cluster")
|
||||
output.Info(" 3. Deploy services: wild setup services")
|
||||
output.Info("")
|
||||
output.Info("Project structure created:")
|
||||
output.Info(" ├── .wildcloud/ # Project metadata")
|
||||
output.Info(" ├── apps/ # Application configurations")
|
||||
output.Info(" ├── config.yaml # Cluster configuration")
|
||||
output.Info(" ├── secrets.yaml # Sensitive data")
|
||||
output.Info(" ├── .gitignore # Git ignore rules")
|
||||
output.Info(" └── README.md # Project documentation")
|
||||
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user