---
menu:
  contribute:
    parent: Contributing and managing patterns
title: Implementation requirements
weight: 52
aliases: /contribute/implementation/
---

:toc:
:imagesdir: /images
:_content-type: ASSEMBLY
include::modules/comm-attributes.adoc[]

[id="technical-requirements"]
== Technical requirements

Consider these requirements specific to the implementation of all {solution-name-upstream} and their tiers.

The requirements are categorized as follows:

Must::
These are nonnegotiable, core requirements that must be implemented.
Should::
These are important but not critical; their implementation enhances the pattern.
Can::
These are optional or desirable features, but their absence does not hinder the implementation of a pattern.

[id="must-implementation-requirements"]
=== Must

. Patterns must include one or more Git repositories in a publicly accessible location, containing configuration elements that can be consumed by the {rh-gitops} Operator without supplying custom Argo CD images.
. Patterns must be useful without all content stored in private Git repositories.
. Patterns must include a list of names and versions of all the products and projects that the pattern consumes.
. Patterns must be useful without any sample applications that are private or that lack public sources.
. Patterns must *not* degrade due to lack of updates or opaque incompatibilities in closed source applications.
. Patterns must *not* store sensitive data elements including, but not limited to, passwords in Git repositories.
. Patterns must be possible to deploy on any installer-provisioned infrastructure OpenShift cluster (BYO).
+
{solution-name-upstream} distinguish between the provisioning and configuration requirements of the initial cluster (`Patterns`) and of clusters or machines that are managed by the initial cluster (`Managed clusters`).
. Patterns must use a standardized https://github.com/validatedpatterns/common/tree/v1/clustergroup[clustergroup] Helm chart as the initial {rh-gitops} application that describes all namespaces, subscriptions, and any other GitOps applications which contain the configuration elements that make up the solution.
. Managed clusters must operate on the premise of `eventual consistency` (automatic retries, and an expectation of idempotence), which is one of the essential benefits of the GitOps model.
. Imperative elements must be implemented as idempotent code stored in Git repository.

[id="should-implementation-requirements"]
=== Should

. Patterns should include sample applications to demonstrate the business problems addressed by the pattern.
. Patterns should try to indicate which parts are foundational as opposed to being for demonstration purposes.
. Patterns should use the {validated-patterns-op} to deploy patterns. However, anything that creates the {rh-gitops-short} subscription and initial clustergroup application could be acceptable.
. Patterns should embody the link:https://www.redhat.com/en/products/open-hybrid-cloud[Open Hybrid Cloud model] unless there is a compelling reason to limit the availability of functionality to a specific platform or topology.
. Patterns should use industry standards and {redhat} products for all required tooling.
+
Patterns require current best practices at the time of pattern development. Solutions that do not conform to best practices should expect to justify non-conformance or expend engineering effort to conform.
. Patterns should *not* make use of upstream or community Operators and images except, depending on the market segment, where it is critical to the overall solution.
+
Such Operators are forbidden to be deployed into an increasing number of customer environments, which limits the pattern reuse. Alternatively, consider to productize the Operator, and build it in-cluster from trusted sources as part of the pattern.
. Patterns should be decomposed into modules that perform a specific function, so that they can be reused in other patterns.
+
For example, Bucket Notification is a capability in the {med-pattern} that could be used for other solutions.
. Patterns should use {rh-ansible} to drive the declarative provisioning and management of managed hosts, for example, {rhel-first}. See also `Imperative elements`.
. Patterns should use {rh-rhacm-first} to manage policy and compliance on any managed clusters.
. Patterns should use {rh-rhacm} and a https://github.com/validatedpatterns/common/tree/v1/acm[standardized RHACM chart] to deploy and configure {rh-gitops-short} to managed clusters.
. Managed clusters should be loosely coupled to their hub, and use {rh-gitops-short} to consume applications and configuration directly from Git as opposed to having hard dependencies on a centralized cluster.
. Managed clusters should use the `pull` deployment model for obtaining their configuration.
. Imperative elements should be implemented as Ansible playbooks.
. Imperative elements should be driven declaratively implying that the playbooks should be triggered by Jobs or CronJobs stored in Git and delivered by {rh-gitops-short}.

[id="can-implementation-requirements"]
=== Can

. Patterns can include additional configuration and/or demo elements located in one or more additional private Git repositories.
. Patterns can include automation that deploys a known set of clusters and/or machines in a specific topology.
. Patterns can limit functionality/testing claims to specific platforms, topologies, and cluster/node sizes.
. Patterns can consume Operators from established partners (for example, Hashicorp Vault, and Seldon)
. Patterns can include managed clusters.
. Patterns can include details or automation for provisioning managed clusters, or rely on the admin to pre-provision them out-of-band.
. Patterns can also choose to model multi-cluster solutions as an uncoordinated collection of initial hub clusters.
. Imperative elements can interact with cluster state or external influences.
