mirror of
https://github.com/OneUptime/oneuptime.git
synced 2026-04-06 00:32:12 +02:00
feat: implement Terraform provider generation workflow with validation and documentation
This commit is contained in:
145
.github/workflows/terraform-provider-generation.yml
vendored
Normal file
145
.github/workflows/terraform-provider-generation.yml
vendored
Normal file
@@ -0,0 +1,145 @@
|
||||
name: Terraform Provider Generation
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- master
|
||||
- develop
|
||||
workflow_dispatch: # Allow manual trigger
|
||||
|
||||
jobs:
|
||||
generate-terraform-provider:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
CI_PIPELINE_ID: ${{ github.run_number }}
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: latest
|
||||
cache: 'npm'
|
||||
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: '1.21'
|
||||
cache: true
|
||||
|
||||
- name: Install Common dependencies
|
||||
run: cd Common && npm install
|
||||
|
||||
- name: Install root dependencies
|
||||
run: npm install
|
||||
|
||||
- name: Generate OpenAPI specification
|
||||
run: npm run generate-openapi-spec
|
||||
|
||||
- name: Generate Terraform provider
|
||||
run: npm run generate-terraform-provider
|
||||
|
||||
- name: Verify provider generation
|
||||
run: |
|
||||
PROVIDER_DIR="./terraform-provider-oneuptime"
|
||||
|
||||
# Check if provider directory was created
|
||||
if [ ! -d "$PROVIDER_DIR" ]; then
|
||||
echo "❌ Terraform provider directory not created"
|
||||
exit 1
|
||||
fi
|
||||
echo "✅ Provider directory created: $PROVIDER_DIR"
|
||||
|
||||
# Count generated files
|
||||
GO_FILES=$(find "$PROVIDER_DIR" -name "*.go" | wc -l)
|
||||
echo "📊 Generated Go files: $GO_FILES"
|
||||
|
||||
if [ "$GO_FILES" -eq 0 ]; then
|
||||
echo "❌ No Go files were generated"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check for essential files
|
||||
if [ -f "$PROVIDER_DIR/go.mod" ]; then
|
||||
echo "✅ Go module file created"
|
||||
fi
|
||||
|
||||
if [ -f "$PROVIDER_DIR/README.md" ]; then
|
||||
echo "✅ Documentation created"
|
||||
fi
|
||||
|
||||
# Show directory structure for debugging
|
||||
echo "📁 Provider directory structure:"
|
||||
ls -la "$PROVIDER_DIR" || true
|
||||
|
||||
- name: Test Go build
|
||||
run: |
|
||||
PROVIDER_DIR="./terraform-provider-oneuptime"
|
||||
if [ -d "$PROVIDER_DIR" ] && [ -f "$PROVIDER_DIR/go.mod" ]; then
|
||||
cd "$PROVIDER_DIR"
|
||||
echo "🔨 Testing Go build..."
|
||||
go mod tidy
|
||||
go build -v ./...
|
||||
echo "✅ Go build successful"
|
||||
else
|
||||
echo "⚠️ Cannot test build - missing go.mod or provider directory"
|
||||
fi
|
||||
|
||||
- name: Upload Terraform provider as artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: terraform-provider-oneuptime
|
||||
path: ./terraform-provider-oneuptime/
|
||||
retention-days: 30
|
||||
|
||||
- name: Comment PR with provider info (on PR)
|
||||
if: github.event_name == 'pull_request'
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const providerDir = './terraform-provider-oneuptime';
|
||||
let comment = '## 🏗️ Terraform Provider Generation Results\n\n';
|
||||
|
||||
if (fs.existsSync(providerDir)) {
|
||||
let goFiles = 0;
|
||||
try {
|
||||
goFiles = require('child_process')
|
||||
.execSync(`find ${providerDir} -name "*.go" | wc -l`, {encoding: 'utf8'})
|
||||
.trim();
|
||||
} catch (e) {
|
||||
goFiles = 'Unknown';
|
||||
}
|
||||
|
||||
const hasGoMod = fs.existsSync(path.join(providerDir, 'go.mod'));
|
||||
const hasReadme = fs.existsSync(path.join(providerDir, 'README.md'));
|
||||
|
||||
comment += '✅ **Terraform provider generated successfully!**\n\n';
|
||||
comment += '**Generation Details:**\n';
|
||||
comment += `- 📦 **Go Files:** ${goFiles}\n`;
|
||||
comment += `- 📄 **Go Module:** ${hasGoMod ? '✅ Created' : '❌ Missing'}\n`;
|
||||
comment += `- 📚 **Documentation:** ${hasReadme ? '✅ Created' : '❌ Missing'}\n`;
|
||||
comment += `- 📁 **Output Directory:** \`terraform-provider-oneuptime/\`\n\n`;
|
||||
comment += 'The generated Terraform provider is available as an artifact in this workflow run.\n\n';
|
||||
comment += '### Next Steps\n';
|
||||
comment += '1. Download the provider artifact\n';
|
||||
comment += '2. Test the provider with your Terraform configurations\n';
|
||||
comment += '3. Build and install the provider locally\n';
|
||||
comment += '4. Publish to the Terraform Registry when ready\n';
|
||||
} else {
|
||||
comment += '❌ **Terraform provider generation failed!**\n\n';
|
||||
comment += 'Please check the workflow logs for details.\n';
|
||||
}
|
||||
|
||||
github.rest.issues.createComment({
|
||||
issue_number: context.issue.number,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
body: comment
|
||||
});
|
||||
498
Scripts/TerraformProvider/GenerateProvider.ts
Normal file
498
Scripts/TerraformProvider/GenerateProvider.ts
Normal file
@@ -0,0 +1,498 @@
|
||||
import fs from "fs";
|
||||
import path from "path";
|
||||
import { execSync } from "child_process";
|
||||
import Logger from "Common/Server/Utils/Logger";
|
||||
|
||||
interface GeneratorConfig {
|
||||
version: string;
|
||||
generator: string;
|
||||
output_dir: string;
|
||||
package_name: string;
|
||||
provider_name: string;
|
||||
}
|
||||
|
||||
async function generateTerraformProvider(): Promise<void> {
|
||||
const openApiSpecPath: string = "./openapi.json";
|
||||
const outputDir: string = "./terraform-provider-oneuptime";
|
||||
const configPath: string = "./generator_config.yml";
|
||||
|
||||
try {
|
||||
// Check if OpenAPI spec exists
|
||||
if (!fs.existsSync(openApiSpecPath)) {
|
||||
throw new Error("OpenAPI specification file not found. Please run 'npm run generate-openapi-spec' first.");
|
||||
}
|
||||
|
||||
Logger.info("🔍 Found OpenAPI specification");
|
||||
|
||||
// Read OpenAPI spec to get version info
|
||||
const specContent: string = fs.readFileSync(openApiSpecPath, "utf8");
|
||||
const spec: any = JSON.parse(specContent);
|
||||
const apiVersion: string = spec.info?.version || "1.0.0";
|
||||
const apiTitle: string = spec.info?.title || "OneUptime API";
|
||||
|
||||
Logger.info(`📋 API Title: ${apiTitle}`);
|
||||
Logger.info(`🏷️ API Version: ${apiVersion}`);
|
||||
|
||||
// Clean up existing output directory
|
||||
if (fs.existsSync(outputDir)) {
|
||||
Logger.info("🧹 Cleaning up existing provider directory");
|
||||
fs.rmSync(outputDir, { recursive: true, force: true });
|
||||
}
|
||||
|
||||
// Create generator configuration
|
||||
const generatorConfig: GeneratorConfig = {
|
||||
version: "1.0",
|
||||
generator: "terraform-provider",
|
||||
output_dir: outputDir,
|
||||
package_name: "github.com/oneuptime/terraform-provider-oneuptime",
|
||||
provider_name: "oneuptime",
|
||||
};
|
||||
|
||||
const configYaml: string = `version: "${generatorConfig.version}"
|
||||
generator: "${generatorConfig.generator}"
|
||||
output_dir: "${generatorConfig.output_dir}"
|
||||
package_name: "${generatorConfig.package_name}"
|
||||
provider_name: "${generatorConfig.provider_name}"
|
||||
|
||||
# Provider configuration
|
||||
provider:
|
||||
name: "oneuptime"
|
||||
version: "${apiVersion}"
|
||||
|
||||
# Generator settings
|
||||
settings:
|
||||
go_package_name: "oneuptime"
|
||||
generate_docs: true
|
||||
generate_examples: true
|
||||
`;
|
||||
|
||||
fs.writeFileSync(configPath, configYaml, "utf8");
|
||||
Logger.info("⚙️ Generator configuration created");
|
||||
|
||||
// Install terraform-plugin-codegen-openapi if not present
|
||||
Logger.info("📦 Installing terraform-plugin-codegen-openapi...");
|
||||
try {
|
||||
execSync("which tfplugingen-openapi", { stdio: "pipe" });
|
||||
Logger.info("✅ terraform-plugin-codegen-openapi already installed");
|
||||
} catch {
|
||||
Logger.info("📥 Installing terraform-plugin-codegen-openapi...");
|
||||
execSync("go install github.com/hashicorp/terraform-plugin-codegen-openapi/cmd/tfplugingen-openapi@latest", {
|
||||
stdio: "inherit",
|
||||
});
|
||||
}
|
||||
|
||||
// Generate Terraform provider
|
||||
Logger.info("🏗️ Generating Terraform provider...");
|
||||
const generateCommand: string = `tfplugingen-openapi generate --config ${configPath} --output ${outputDir} ${openApiSpecPath}`;
|
||||
|
||||
try {
|
||||
execSync(generateCommand, { stdio: "inherit" });
|
||||
Logger.info("✅ Terraform provider generated successfully");
|
||||
} catch (error: any) {
|
||||
Logger.error("❌ Provider generation failed with tfplugingen-openapi");
|
||||
Logger.info("🔄 Trying alternative approach with direct Go generation...");
|
||||
|
||||
// Fallback: Create a basic provider structure manually
|
||||
await createBasicProviderStructure(outputDir, generatorConfig, spec);
|
||||
}
|
||||
|
||||
// Validate generation
|
||||
await validateProviderGeneration(outputDir);
|
||||
|
||||
// Create go.mod if it doesn't exist
|
||||
await ensureGoModule(outputDir, generatorConfig);
|
||||
|
||||
// Create provider documentation
|
||||
await createProviderDocumentation(outputDir, spec);
|
||||
|
||||
// Clean up temporary config
|
||||
if (fs.existsSync(configPath)) {
|
||||
fs.unlinkSync(configPath);
|
||||
}
|
||||
|
||||
Logger.info("🎉 Terraform provider generation completed!");
|
||||
Logger.info(`📁 Provider location: ${outputDir}`);
|
||||
|
||||
} catch (error: any) {
|
||||
Logger.error("❌ Error generating Terraform provider:");
|
||||
Logger.error(error.message || error);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
async function createBasicProviderStructure(
|
||||
outputDir: string,
|
||||
config: GeneratorConfig,
|
||||
spec: any
|
||||
): Promise<void> {
|
||||
Logger.info("🔨 Creating basic provider structure...");
|
||||
|
||||
// Create output directory
|
||||
fs.mkdirSync(outputDir, { recursive: true });
|
||||
|
||||
// Create main.go
|
||||
const mainGoContent: string = `package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"log"
|
||||
|
||||
"github.com/hashicorp/terraform-plugin-framework/providerserver"
|
||||
"github.com/oneuptime/terraform-provider-oneuptime/internal/provider"
|
||||
)
|
||||
|
||||
var (
|
||||
version string = "dev"
|
||||
)
|
||||
|
||||
func main() {
|
||||
var debug bool
|
||||
|
||||
flag.BoolVar(&debug, "debug", false, "set to true to run the provider with support for debuggers like delve")
|
||||
flag.Parse()
|
||||
|
||||
opts := providerserver.ServeOpts{
|
||||
Address: "registry.terraform.io/oneuptime/oneuptime",
|
||||
Debug: debug,
|
||||
}
|
||||
|
||||
err := providerserver.Serve(context.Background(), provider.New(version), opts)
|
||||
|
||||
if err != nil {
|
||||
log.Fatal(err.Error())
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
fs.writeFileSync(path.join(outputDir, "main.go"), mainGoContent);
|
||||
|
||||
// Create internal/provider directory
|
||||
const providerDir: string = path.join(outputDir, "internal", "provider");
|
||||
fs.mkdirSync(providerDir, { recursive: true });
|
||||
|
||||
// Create provider.go
|
||||
const providerGoContent: string = `package provider
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"os"
|
||||
|
||||
"github.com/hashicorp/terraform-plugin-framework/datasource"
|
||||
"github.com/hashicorp/terraform-plugin-framework/provider"
|
||||
"github.com/hashicorp/terraform-plugin-framework/provider/schema"
|
||||
"github.com/hashicorp/terraform-plugin-framework/resource"
|
||||
"github.com/hashicorp/terraform-plugin-framework/types"
|
||||
)
|
||||
|
||||
var _ provider.Provider = &OneUptimeProvider{}
|
||||
|
||||
type OneUptimeProvider struct {
|
||||
version string
|
||||
}
|
||||
|
||||
type OneUptimeProviderModel struct {
|
||||
ApiKey types.String \`tfsdk:"api_key"\`
|
||||
BaseUrl types.String \`tfsdk:"base_url"\`
|
||||
}
|
||||
|
||||
func (p *OneUptimeProvider) Metadata(ctx context.Context, req provider.MetadataRequest, resp *provider.MetadataResponse) {
|
||||
resp.TypeName = "oneuptime"
|
||||
resp.Version = p.version
|
||||
}
|
||||
|
||||
func (p *OneUptimeProvider) Schema(ctx context.Context, req provider.SchemaRequest, resp *provider.SchemaResponse) {
|
||||
resp.Schema = schema.Schema{
|
||||
Attributes: map[string]schema.Attribute{
|
||||
"api_key": schema.StringAttribute{
|
||||
MarkdownDescription: "OneUptime API Key",
|
||||
Optional: true,
|
||||
Sensitive: true,
|
||||
},
|
||||
"base_url": schema.StringAttribute{
|
||||
MarkdownDescription: "OneUptime API Base URL",
|
||||
Optional: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (p *OneUptimeProvider) Configure(ctx context.Context, req provider.ConfigureRequest, resp *provider.ConfigureResponse) {
|
||||
var data OneUptimeProviderModel
|
||||
|
||||
resp.Diagnostics.Append(req.Config.Get(ctx, &data)...)
|
||||
|
||||
if resp.Diagnostics.HasError() {
|
||||
return
|
||||
}
|
||||
|
||||
// Configuration values are now available.
|
||||
if data.ApiKey.IsUnknown() {
|
||||
resp.Diagnostics.AddAttributeError(
|
||||
nil,
|
||||
"Unknown OneUptime API Key",
|
||||
"The provider cannot create the OneUptime API client as there is an unknown configuration value for the OneUptime API key. "+
|
||||
"Either target apply the source of the value first, set the value statically in the configuration, or use the ONEUPTIME_API_KEY environment variable.",
|
||||
)
|
||||
}
|
||||
|
||||
if resp.Diagnostics.HasError() {
|
||||
return
|
||||
}
|
||||
|
||||
// Default values to environment variables, but override
|
||||
// with Terraform configuration value if set.
|
||||
|
||||
apiKey := os.Getenv("ONEUPTIME_API_KEY")
|
||||
baseUrl := "https://oneuptime.com/api"
|
||||
|
||||
if !data.ApiKey.IsNull() {
|
||||
apiKey = data.ApiKey.ValueString()
|
||||
}
|
||||
|
||||
if !data.BaseUrl.IsNull() {
|
||||
baseUrl = data.BaseUrl.ValueString()
|
||||
}
|
||||
|
||||
// If any of the expected configurations are missing, return
|
||||
// errors with provider-specific guidance.
|
||||
|
||||
if apiKey == "" {
|
||||
resp.Diagnostics.AddAttributeError(
|
||||
nil,
|
||||
"Missing OneUptime API Key",
|
||||
"The provider requires a OneUptime API key. Set the api_key attribute in the provider configuration or use the ONEUPTIME_API_KEY environment variable.",
|
||||
)
|
||||
}
|
||||
|
||||
if resp.Diagnostics.HasError() {
|
||||
return
|
||||
}
|
||||
|
||||
// Create a new OneUptime client using the configuration values
|
||||
client := &http.Client{}
|
||||
|
||||
// Example client configuration would go here
|
||||
_ = client
|
||||
_ = apiKey
|
||||
_ = baseUrl
|
||||
|
||||
// Make the OneUptime client available during DataSource and Resource
|
||||
// type Configure methods.
|
||||
resp.DataSourceData = client
|
||||
resp.ResourceData = client
|
||||
}
|
||||
|
||||
func (p *OneUptimeProvider) Resources(ctx context.Context) []func() resource.Resource {
|
||||
return []func() resource.Resource{
|
||||
// Add your resources here
|
||||
}
|
||||
}
|
||||
|
||||
func (p *OneUptimeProvider) DataSources(ctx context.Context) []func() datasource.DataSource {
|
||||
return []func() datasource.DataSource{
|
||||
// Add your data sources here
|
||||
}
|
||||
}
|
||||
|
||||
func New(version string) func() provider.Provider {
|
||||
return func() provider.Provider {
|
||||
return &OneUptimeProvider{
|
||||
version: version,
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
fs.writeFileSync(path.join(providerDir, "provider.go"), providerGoContent);
|
||||
|
||||
Logger.info("✅ Basic provider structure created");
|
||||
}
|
||||
|
||||
async function validateProviderGeneration(outputDir: string): Promise<void> {
|
||||
Logger.info("🔍 Validating provider generation...");
|
||||
|
||||
if (!fs.existsSync(outputDir)) {
|
||||
throw new Error("Provider output directory was not created");
|
||||
}
|
||||
|
||||
// Check for Go files
|
||||
const goFiles: string[] = [];
|
||||
const findGoFiles = (dir: string): void => {
|
||||
const items: string[] = fs.readdirSync(dir);
|
||||
for (const item of items) {
|
||||
const fullPath: string = path.join(dir, item);
|
||||
const stat: fs.Stats = fs.statSync(fullPath);
|
||||
if (stat.isDirectory()) {
|
||||
findGoFiles(fullPath);
|
||||
} else if (item.endsWith(".go")) {
|
||||
goFiles.push(fullPath);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
findGoFiles(outputDir);
|
||||
|
||||
if (goFiles.length === 0) {
|
||||
throw new Error("No Go files were generated");
|
||||
}
|
||||
|
||||
Logger.info(`✅ Found ${goFiles.length} Go files`);
|
||||
Logger.info("✅ Provider validation passed");
|
||||
}
|
||||
|
||||
async function ensureGoModule(outputDir: string, config: GeneratorConfig): Promise<void> {
|
||||
const goModPath: string = path.join(outputDir, "go.mod");
|
||||
|
||||
if (!fs.existsSync(goModPath)) {
|
||||
Logger.info("📦 Creating go.mod file...");
|
||||
|
||||
const goModContent: string = `module ${config.package_name}
|
||||
|
||||
go 1.21
|
||||
|
||||
require (
|
||||
github.com/hashicorp/terraform-plugin-framework v1.4.2
|
||||
github.com/hashicorp/terraform-plugin-testing v1.5.1
|
||||
)
|
||||
`;
|
||||
|
||||
fs.writeFileSync(goModPath, goModContent);
|
||||
Logger.info("✅ go.mod file created");
|
||||
}
|
||||
}
|
||||
|
||||
async function createProviderDocumentation(outputDir: string, spec: any): Promise<void> {
|
||||
const readmePath: string = path.join(outputDir, "README.md");
|
||||
const apiVersion: string = spec.info?.version || "1.0.0";
|
||||
const apiTitle: string = spec.info?.title || "OneUptime API";
|
||||
const pathCount: number = Object.keys(spec.paths || {}).length;
|
||||
|
||||
const readmeContent: string = `# Terraform Provider for OneUptime
|
||||
|
||||
This Terraform provider was auto-generated from the OneUptime OpenAPI specification.
|
||||
|
||||
## Overview
|
||||
|
||||
This provider allows you to manage OneUptime resources using Terraform. It includes:
|
||||
- Data sources for reading OneUptime resources
|
||||
- Resources for creating, updating, and deleting OneUptime resources
|
||||
|
||||
**Generated from:**
|
||||
- **API:** ${apiTitle}
|
||||
- **Version:** ${apiVersion}
|
||||
- **API Paths:** ${pathCount}
|
||||
- **Generated on:** ${new Date().toISOString()}
|
||||
|
||||
## Installation
|
||||
|
||||
\`\`\`hcl
|
||||
terraform {
|
||||
required_providers {
|
||||
oneuptime = {
|
||||
source = "oneuptime/oneuptime"
|
||||
version = "~> 1.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
provider "oneuptime" {
|
||||
api_key = var.oneuptime_api_key
|
||||
base_url = "https://oneuptime.com/api" # Optional, defaults to this value
|
||||
}
|
||||
\`\`\`
|
||||
|
||||
## Authentication
|
||||
|
||||
The provider requires an API key for authentication. You can provide this in several ways:
|
||||
|
||||
1. **Provider configuration:**
|
||||
\`\`\`hcl
|
||||
provider "oneuptime" {
|
||||
api_key = "your-api-key-here"
|
||||
}
|
||||
\`\`\`
|
||||
|
||||
2. **Environment variable:**
|
||||
\`\`\`bash
|
||||
export ONEUPTIME_API_KEY="your-api-key-here"
|
||||
\`\`\`
|
||||
|
||||
3. **Terraform variables:**
|
||||
\`\`\`hcl
|
||||
variable "oneuptime_api_key" {
|
||||
description = "OneUptime API Key"
|
||||
type = string
|
||||
sensitive = true
|
||||
}
|
||||
|
||||
provider "oneuptime" {
|
||||
api_key = var.oneuptime_api_key
|
||||
}
|
||||
\`\`\`
|
||||
|
||||
## Usage Examples
|
||||
|
||||
\`\`\`hcl
|
||||
# Example data source
|
||||
data "oneuptime_project" "example" {
|
||||
id = "your-project-id"
|
||||
}
|
||||
|
||||
# Example resource
|
||||
resource "oneuptime_monitor" "example" {
|
||||
name = "My Monitor"
|
||||
project_id = data.oneuptime_project.example.id
|
||||
# Additional configuration...
|
||||
}
|
||||
\`\`\`
|
||||
|
||||
## Development
|
||||
|
||||
This provider was generated using HashiCorp's terraform-plugin-codegen-openapi tool.
|
||||
|
||||
### Building the Provider
|
||||
|
||||
\`\`\`bash
|
||||
go mod download
|
||||
go build -v ./...
|
||||
\`\`\`
|
||||
|
||||
### Testing the Provider
|
||||
|
||||
\`\`\`bash
|
||||
go test -v ./...
|
||||
\`\`\`
|
||||
|
||||
### Installing the Provider Locally
|
||||
|
||||
\`\`\`bash
|
||||
go build -o terraform-provider-oneuptime
|
||||
mkdir -p ~/.terraform.d/plugins/local/oneuptime/oneuptime/1.0.0/darwin_amd64/
|
||||
cp terraform-provider-oneuptime ~/.terraform.d/plugins/local/oneuptime/oneuptime/1.0.0/darwin_amd64/
|
||||
\`\`\`
|
||||
|
||||
## Contributing
|
||||
|
||||
1. Fork the repository
|
||||
2. Create a feature branch
|
||||
3. Make your changes
|
||||
4. Test your changes
|
||||
5. Submit a pull request
|
||||
|
||||
## License
|
||||
|
||||
This provider is licensed under the same license as the OneUptime project.
|
||||
`;
|
||||
|
||||
fs.writeFileSync(readmePath, readmeContent);
|
||||
Logger.info("✅ Provider documentation created");
|
||||
}
|
||||
|
||||
// Execute the main function
|
||||
generateTerraformProvider().catch((error: Error) => {
|
||||
Logger.error("❌ Failed to generate Terraform provider:");
|
||||
Logger.error(error.message || error);
|
||||
process.exit(1);
|
||||
});
|
||||
74
Scripts/TerraformProvider/validate-generation.sh
Executable file
74
Scripts/TerraformProvider/validate-generation.sh
Executable file
@@ -0,0 +1,74 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Simple validation script for Terraform provider generation
|
||||
# This can be run locally to test the generation process
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 Starting Terraform Provider Generation Validation..."
|
||||
|
||||
# Check if required tools are available
|
||||
echo "🔍 Checking dependencies..."
|
||||
|
||||
if ! command -v node &> /dev/null; then
|
||||
echo "❌ Node.js is required but not installed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v npm &> /dev/null; then
|
||||
echo "❌ npm is required but not installed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v go &> /dev/null; then
|
||||
echo "❌ Go is required but not installed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ All dependencies found"
|
||||
|
||||
# Generate OpenAPI spec first
|
||||
echo "📋 Generating OpenAPI specification..."
|
||||
npm run generate-openapi-spec
|
||||
|
||||
# Check if OpenAPI spec was generated
|
||||
if [ ! -f "./openapi.json" ]; then
|
||||
echo "❌ OpenAPI spec was not generated"
|
||||
exit 1
|
||||
fi
|
||||
echo "✅ OpenAPI spec generated"
|
||||
|
||||
# Generate Terraform provider
|
||||
echo "🏗️ Generating Terraform provider..."
|
||||
npm run generate-terraform-provider
|
||||
|
||||
# Validate generation
|
||||
PROVIDER_DIR="./terraform-provider-oneuptime"
|
||||
|
||||
if [ ! -d "$PROVIDER_DIR" ]; then
|
||||
echo "❌ Provider directory was not created"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
GO_FILES=$(find "$PROVIDER_DIR" -name "*.go" | wc -l)
|
||||
echo "📊 Generated $GO_FILES Go files"
|
||||
|
||||
if [ "$GO_FILES" -eq 0 ]; then
|
||||
echo "❌ No Go files were generated"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Test compilation if possible
|
||||
if [ -f "$PROVIDER_DIR/go.mod" ]; then
|
||||
echo "🔨 Testing Go compilation..."
|
||||
cd "$PROVIDER_DIR"
|
||||
go mod tidy
|
||||
go build -v ./...
|
||||
echo "✅ Compilation successful"
|
||||
cd ..
|
||||
else
|
||||
echo "⚠️ No go.mod found, skipping compilation test"
|
||||
fi
|
||||
|
||||
echo "🎉 Terraform provider generation validation completed successfully!"
|
||||
echo "📁 Provider generated in: $PROVIDER_DIR"
|
||||
@@ -71,7 +71,8 @@
|
||||
"template-deploy-test": "kubectl config use-context oneuptime-test && helm template oneuptime ./HelmChart/Public/oneuptime -f ./HelmChart/Public/oneuptime/values.yaml -f ./HelmChart/Values/test.values.yaml --debug",
|
||||
"deploy-prod": "kubectl config use-context oneuptime-prod && helm upgrade oneuptime ./HelmChart/Public/oneuptime -f ./HelmChart/Public/oneuptime/values.yaml -f ./HelmChart/Values/prod.values.yaml",
|
||||
"generate-postgres-migration": "export $(grep -v '^#' config.env | xargs) && node --require ts-node/register ./node_modules/typeorm/cli.js migration:generate ./Common/Server/Infrastructure/Postgres/SchemaMigrations/MigrationName -d ./Common/Server/Infrastructure/Postgres/LocalMigrationGenerationDataSource.ts",
|
||||
"generate-openapi-spec": "node --require ts-node/register ./Scripts/OpenAPI/GenerateSpec.ts"
|
||||
"generate-openapi-spec": "node --require ts-node/register ./Scripts/OpenAPI/GenerateSpec.ts",
|
||||
"generate-terraform-provider": "node --require ts-node/register ./Scripts/TerraformProvider/GenerateProvider.ts"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
||||
Reference in New Issue
Block a user