import requests
import json
import os
from pathlib import Path
class BluebricksPublisher:
def __init__(self, api_key, base_url="https://api.bluebricks.co/api/v1"):
self.api_key = api_key
self.base_url = base_url
self.headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
def create_package(self, name, version, description, source_url):
"""Create a new package"""
payload = {
"name": name,
"version": version,
"description": description,
"type": "blueprint",
"source": {
"type": "git",
"url": source_url,
"ref": "main"
}
}
response = requests.post(
f"{self.base_url}/packages",
headers=self.headers,
json=payload
)
response.raise_for_status()
return response.json()
def upload_file(self, package_id, file_path, target_path="/"):
"""Upload a file to the package"""
files = {
"file": open(file_path, "rb")
}
data = {
"path": target_path,
"type": "source"
}
headers = {"Authorization": f"Bearer {self.api_key}"}
response = requests.post(
f"{self.base_url}/packages/{package_id}/files",
headers=headers,
files=files,
data=data
)
response.raise_for_status()
return response.json()
def publish_blueprint(self, package_id, version, description, changelog):
"""Publish the blueprint"""
payload = {
"version": version,
"description": description,
"changelog": changelog
}
response = requests.post(
f"{self.base_url}/packages/{package_id}/publish",
headers=self.headers,
json=payload
)
response.raise_for_status()
return response.json()
# Usage example
def publish_blueprint_from_directory(blueprint_dir, api_key):
publisher = BluebricksPublisher(api_key)
# Read bricks.json
bricks_config = json.load(open(Path(blueprint_dir) / "bricks.json"))
# Create package
package = publisher.create_package(
name=bricks_config["name"],
version=bricks_config["version"],
description=bricks_config["description"],
source_url="https://github.com/user/repo"
)
package_id = package["id"]
# Upload configuration file
publisher.upload_file(
package_id,
Path(blueprint_dir) / "bricks.json",
"/"
)
# Upload source files
for tf_file in Path(blueprint_dir).glob("*.tf"):
publisher.upload_file(
package_id,
tf_file,
f"/terraform/{tf_file.name}"
)
# Publish blueprint
result = publisher.publish_blueprint(
package_id,
bricks_config["version"],
bricks_config["description"],
"Published via API"
)
print(f"Blueprint published successfully: {result}")
return result
# Example usage
if __name__ == "__main__":
api_key = os.getenv("BRICKS_API_KEY")
blueprint_dir = "./my_blueprint"
publish_blueprint_from_directory(blueprint_dir, api_key)