|
| 1 | +--- |
| 2 | +title: Developer Abstractions |
| 3 | +description: Developer abstractions for building and running applications |
| 4 | +--- |
| 5 | + |
| 6 | +# Developer Abstractions |
| 7 | + |
| 8 | +Developer abstractions in OpenChoreo enable teams to build, deploy, and operate cloud-native applications without |
| 9 | +managing infrastructure complexity. These abstractions provide a declarative model for expressing application |
| 10 | +architecture, dependencies, and operational requirements while the platform handles the underlying Kubernetes resources, |
| 11 | +networking, and security configurations automatically. |
| 12 | + |
| 13 | +## Project |
| 14 | + |
| 15 | +A **Project** represents a bounded context in Domain-Driven Design terms - a cohesive collection of components that |
| 16 | +together implement a specific business capability or application domain. It serves as the primary organizational unit |
| 17 | +for developers, defining clear boundaries for code ownership, deployment coordination, and operational responsibility. |
| 18 | + |
| 19 | +Projects establish both logical and physical boundaries in the platform. Logically, they group related components that |
| 20 | +share common business logic, data models, and team ownership. Physically, they translate into isolated deployment units |
| 21 | +with dedicated namespaces, network boundaries, and security policies. This alignment between organizational structure |
| 22 | +and technical architecture enables teams to work autonomously while maintaining clear integration points with other |
| 23 | +projects. |
| 24 | + |
| 25 | +The project boundary also defines the scope for internal communication and shared resources. Components within a project |
| 26 | +can communicate freely with each other. This locality principle reduces complexity for |
| 27 | +developers while maintaining security and isolation between different application domains. |
| 28 | + |
| 29 | +## Component |
| 30 | + |
| 31 | +A **Component** represents a deployable unit of software - the fundamental building block of applications in OpenChoreo. |
| 32 | +Each component encapsulates a specific piece of functionality, whether it's a microservice handling business logic, a |
| 33 | +web application serving user interfaces, or a background job processing data. |
| 34 | + |
| 35 | +Components use a **ComponentType** reference to determine their deployment characteristics. This reference follows the |
| 36 | +format `{workloadType}/{componentTypeName}`, such as `deployment/web-service` or `cronjob/data-processor`. This explicit |
| 37 | +typing allows platform engineers to define multiple variations of deployment patterns for the same workload type, each |
| 38 | +tuned for different use cases. |
| 39 | + |
| 40 | +The Component resource connects four essential elements: |
| 41 | + |
| 42 | +**ComponentType Reference** specifies which platform-defined template governs this component's deployment. The |
| 43 | +ComponentType defines the available configuration schema, resource templates, and allowed workflows. This separation |
| 44 | +of concerns means developers work with a simplified interface while platform engineers maintain control over |
| 45 | +infrastructure patterns. |
| 46 | + |
| 47 | +**Parameters** provide the component-specific configuration values that conform to the schema defined in the |
| 48 | +ComponentType. These values include both static parameters that remain consistent across environments and |
| 49 | +environment-overridable parameters that can be customized per environment through ComponentDeployment resources. The |
| 50 | +inline schema syntax from the ComponentType validates these values automatically, ensuring developers provide correct |
| 51 | +types and stay within defined constraints. |
| 52 | + |
| 53 | +**Traits** enable composition of additional capabilities into the component. Each trait instance adds specific |
| 54 | +functionality like persistent storage, caching, or monitoring. Traits can be instantiated multiple times with |
| 55 | +different configurations using unique instance names. For example, a component might attach multiple persistent volume |
| 56 | +traits for different storage needs, each with its own size, storage class, and mount configuration. Traits use the |
| 57 | +same schema-driven approach as ComponentTypes, with parameters and environment overrides that can be customized through |
| 58 | +ComponentDeployment resources. |
| 59 | + |
| 60 | +**Workflow Configuration** optionally specifies how to build the component from source code. This references a |
| 61 | +Workflow and provides the developer-configured schema values needed to execute builds. The workflow integration |
| 62 | +enables automated container image creation triggered by code changes or manual developer actions. |
| 63 | + |
| 64 | +The component abstraction thus becomes a declarative specification that combines: |
| 65 | +- A ComponentType that defines *how* to deploy |
| 66 | +- Parameters that configure *what* to deploy |
| 67 | +- Traits that compose *additional capabilities* |
| 68 | +- A Workflow that defines *how to build* |
| 69 | + |
| 70 | +This composition-based approach enables developers to assemble complex applications from reusable building blocks |
| 71 | +while the platform ensures consistency, governance, and operational best practices through the underlying ComponentType |
| 72 | +and Trait templates. |
| 73 | + |
| 74 | +## Workload |
| 75 | + |
| 76 | +A **Workload** defines the runtime contract of a component - specifying what the component needs to run. The workload |
| 77 | +focuses on application requirements rather than infrastructure details, which are handled by the platform through Classes. |
| 78 | + |
| 79 | +Each component has one workload that describes its runtime needs through several key specifications: |
| 80 | + |
| 81 | +**Containers** define the container images to deploy, along with their commands, arguments, and environment variables. |
| 82 | +This tells the platform what code to run and how to configure it. |
| 83 | + |
| 84 | +**Endpoints** specify the network interfaces that the component exposes - the ports and protocols it listens on. Each |
| 85 | +endpoint declares its type (HTTP, gRPC, TCP, etc.) and port number. These definitions tell the platform what network |
| 86 | +services the component provides, enabling automatic service creation and network policy generation. |
| 87 | + |
| 88 | +**Connections** declare the component's dependencies on other services, whether internal to the platform or external |
| 89 | +third-party services. Each connection specifies how to inject service information into the component through environment |
| 90 | +variables. This enables the platform to manage service discovery, configure network policies, and track dependencies. |
| 91 | + |
| 92 | +This declarative specification can be generated from configuration files in the source repository or applied directly |
| 93 | +to the cluster. The separation between workload (what the application needs) and classes (how the platform provides it) |
| 94 | +enables platform teams to control infrastructure policies while developers focus on application requirements. Resource |
| 95 | +limits, scaling parameters, and operational policies come from the ServiceClass or WebApplicationClass, while the |
| 96 | +workload simply declares what the application needs to function. |
| 97 | + |
| 98 | +## ComponentWorkflowRun |
| 99 | + |
| 100 | +A **ComponentWorkflowRun** represents a runtime execution instance of a ComponentWorkflow - a specialized workflow type |
| 101 | +designed specifically for building components. While ComponentWorkflows define the build template and schema, |
| 102 | +ComponentWorkflowRuns represent actual build executions with specific parameter values and ownership tracking. |
| 103 | + |
| 104 | +ComponentWorkflowRuns bridge the gap between developer intent and CI/CD execution for component builds. Developers |
| 105 | +create ComponentWorkflowRun resources to trigger builds, providing component ownership information, repository details, |
| 106 | +and build parameters. The platform handles all the complexity of rendering the final workflow specification, |
| 107 | +synchronizing secrets, and managing execution in the build plane. |
| 108 | + |
| 109 | +Each ComponentWorkflowRun captures three essential pieces of information: |
| 110 | + |
| 111 | +**Ownership Tracking** links the build execution to a specific component and project. This enables traceability, |
| 112 | +allowing the platform to track which builds belong to which components and maintain build history per component. The |
| 113 | +ownership information includes both project name and component name, ensuring proper audit trails and enabling |
| 114 | +component-specific build operations. |
| 115 | + |
| 116 | +**System Parameters** provide the structured repository information required for build-specific platform features. These |
| 117 | +parameters follow a fixed structure with `repository.url`, `repository.revision.branch`, `repository.revision.commit`, |
| 118 | +and `repository.appPath` fields. This predictable structure enables the platform to support auto-builds triggered by |
| 119 | +webhooks, manual build actions in the UI, build traceability linking images to source commits, and monorepo support by |
| 120 | +identifying specific application paths within repositories. |
| 121 | + |
| 122 | +**Developer Parameters** provide values for the flexible configuration schema defined by the platform engineer in the |
| 123 | +ComponentWorkflow. These might include build version numbers, test modes, resource allocations, timeout settings, |
| 124 | +caching configurations, and retry limits. The schema validation ensures type correctness and constraint satisfaction |
| 125 | +automatically. |
| 126 | + |
| 127 | +This abstraction provides a specialized interface for component builds, where developers interact with curated schemas |
| 128 | +rather than complex CI/CD pipeline definitions. The separation of concerns allows platform engineers to control build |
| 129 | +implementation and security policies through ComponentWorkflow templates while developers manage repository information |
| 130 | +and build parameters through ComponentWorkflowRun instances. ComponentWorkflowRuns can be created manually for ad-hoc |
| 131 | +builds or automatically by platform controllers in response to code changes, supporting both interactive development and |
| 132 | +fully automated CI/CD pipelines while maintaining consistent execution patterns and governance specifically tailored for |
| 133 | +component build operations. |
0 commit comments