<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ramen</title><link>https://ramendr.github.io/ramen/</link><description>Recent content on Ramen</description><generator>Hugo</generator><language>en</language><atom:link href="https://ramendr.github.io/ramen/index.xml" rel="self" type="application/rss+xml"/><item><title>User quick start guide for testing application DR</title><link>https://ramendr.github.io/ramen/docs/user-quick-start/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/user-quick-start/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="user-quick-start-guide-for-testing-application-dr"&gt;User quick start guide for testing application DR&lt;/h1&gt;&#10;&lt;p&gt;This page will help you to set up an environment for testing &lt;strong&gt;Regional-DR&lt;/strong&gt;&#10;basic tests.&lt;/p&gt;&#10;&lt;p&gt;This video will demonstrate how to test application DR &lt;em&gt;after&lt;/em&gt; completing the&#10;configuration.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://www.youtube.com/embed/8-fpChSWzeo"&gt;&lt;img src="https://img.youtube.com/vi/8-fpChSWzeo/hqdefault.jpg" alt="Video demo" loading="lazy" class="img-fluid"&gt;&#10;&lt;/a&gt;&#10;&lt;/p&gt;&#10;&lt;h2 id="what-youll-need"&gt;What you’ll need&lt;/h2&gt;&#10;&lt;p&gt;To set up a &lt;em&gt;Ramen&lt;/em&gt; development environment you will need to run 3 Kubernetes&#10;clusters. &lt;em&gt;Ramen&lt;/em&gt; makes this easy using minikube, but you need enough resources:&lt;/p&gt;</description></item><item><title>Ramen developer quick start guide</title><link>https://ramendr.github.io/ramen/docs/devel-quick-start/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/devel-quick-start/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="ramen-developer-quick-start-guide"&gt;Ramen developer quick start guide&lt;/h1&gt;&#10;&lt;h2 id="contribution-flow"&gt;Contribution Flow&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Fork the repository on GitHub&lt;/li&gt;&#10;&lt;li&gt;Create a branch from where you want to base your work (usually main).&lt;/li&gt;&#10;&lt;li&gt;Make your changes and arrange them in readable commits.&lt;/li&gt;&#10;&lt;li&gt;Make sure your commit messages are in the proper format.&lt;/li&gt;&#10;&lt;li&gt;Make sure all &lt;a href="https://ramendr.github.io/ramen/docs/testing/"&gt;tests&lt;/a&gt;&#10; pass, and add any new&#10;&lt;a href="https://ramendr.github.io/ramen/docs/testing/"&gt;tests&lt;/a&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Push your changes to the branch in your fork of the repository. as&#10;appropriate.&lt;/li&gt;&#10;&lt;li&gt;Submit a pull request to the original repository.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="getting-the-source"&gt;Getting the source&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Fork the &lt;em&gt;Ramen&lt;/em&gt; repository on github&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Clone the source locally&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone git@github.com:my-github-user/ramen.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Add an &lt;code&gt;upstream&lt;/code&gt; remote, to make it easy to sync your repo from upstream.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote add upstream https://github.com/RamenDR/ramen.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Add the commit-msg hook to sign off your commits&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Ramen&lt;/em&gt; requires a &lt;code&gt;Signed-off-by: My Name &amp;lt;myemail@example.com&amp;gt;&lt;/code&gt; footer in&#10;the commit message. To add it automatically to all commits, add this hook:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp hack/commit-msg .git/hooks/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;/ol&gt;</description></item><item><title>Installing Ramen</title><link>https://ramendr.github.io/ramen/docs/install/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/install/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="installing-ramen"&gt;Installing Ramen&lt;/h1&gt;&#10;&lt;p&gt;This guide describes how to install Ramen&amp;rsquo;s disaster recovery operators on your&#10;cluster environment.&lt;/p&gt;&#10;&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;&#10;&lt;p&gt;Ramen consists of two operators that work together to provide disaster recovery&#10;capabilities:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Ramen Hub Operator&lt;/strong&gt; - Installed on the OCM hub cluster, orchestrates DR&#10;operations across managed clusters&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Ramen DR Cluster Operator&lt;/strong&gt; - Installed on each OCM managed cluster,&#10;manages local volume replication and workload protection&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;&#10;&lt;p&gt;Before installing Ramen, ensure the following requirements are met:&lt;/p&gt;</description></item><item><title>Configure Ramen</title><link>https://ramendr.github.io/ramen/docs/configure/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/configure/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="configure-ramen"&gt;Configure Ramen&lt;/h1&gt;&#10;&lt;p&gt;This guide describes how to configure Ramen for disaster recovery operations&#10;after installing the Ramen operators. Configuration involves setting up S3&#10;storage profiles, creating DRCluster resources, and establishing DRPolicy&#10;resources to define replication relationships.&lt;/p&gt;&#10;&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;&#10;&lt;p&gt;Before configuring Ramen, ensure you have completed the installation steps&#10;described in &lt;a href="https://ramendr.github.io/ramen/docs/install/"&gt;install.md&lt;/a&gt;&#10;. You should have:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;OCM (Open Cluster Management)&lt;/strong&gt; with at least two managed clusters&#10;registered&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Ramen hub operator&lt;/strong&gt; installed on the OCM hub cluster&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Ramen catalog&lt;/strong&gt; installed on each managed cluster participating in DR&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="gather-required-information"&gt;Gather Required Information&lt;/h3&gt;&#10;&lt;p&gt;Before starting configuration, collect the following information:&lt;/p&gt;</description></item><item><title>Workload Management Using Ramen</title><link>https://ramendr.github.io/ramen/docs/usage/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/usage/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="workload-management-using-ramen"&gt;Workload Management Using Ramen&lt;/h1&gt;&#10;&lt;p&gt;This guide describes how to protect and manage workloads using Ramen&amp;rsquo;s disaster&#10;recovery capabilities.&lt;/p&gt;&#10;&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;&#10;&lt;p&gt;Ramen supports protecting applications across three different deployment types:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;GitOps Applications (Recommended) - For applications deployed from Git&#10;repositories via ArgoCD ApplicationSets&lt;/li&gt;&#10;&lt;li&gt;Discovered Applications - For existing applications deployed via kubectl,&#10;Helm, or other methods&lt;/li&gt;&#10;&lt;li&gt;Applications with Recipes - For complex stateful applications requiring custom&#10;capture/recovery workflows&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;All methods support the same DR operations:&lt;/p&gt;</description></item><item><title>Using Recipes for Disaster Recovery (DR)</title><link>https://ramendr.github.io/ramen/docs/recipe/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/recipe/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="using-recipes-for-disaster-recovery-dr"&gt;Using Recipes for Disaster Recovery (DR)&lt;/h1&gt;&#10;&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;A recipe is a Kubernetes Custom Resource that defines custom workflows for&#10;capturing and recovering application resources and volumes during disaster&#10;recovery (DR) operations. Recipes are part of Ramen&amp;rsquo;s Kubernetes-native Disaster&#10;Recovery ecosystem, providing vendor-supplied or custom disaster recovery&#10;specifications for complex stateful applications. While Ramen supports multiple&#10;workload protection methods (GitOps, discovered applications), Recipes are&#10;specifically designed for applications that require:&lt;/p&gt;</description></item><item><title>Logging</title><link>https://ramendr.github.io/ramen/docs/logging/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/logging/</guid><description>&lt;h1 id="logging"&gt;Logging&lt;/h1&gt;&#10;&lt;p&gt;This document outlines the logging standards and best practices for Ramen.&lt;/p&gt;&#10;&lt;h2 id="general-principles"&gt;General Principles&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Consistency&lt;/strong&gt;: All controllers should follow the same logging conventions.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Performance Awareness&lt;/strong&gt;: Logging should not significantly impact the&#10;performance. Be mindful of the logging levels and the amount of data logged.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="logger-configuration"&gt;Logger Configuration&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Each controller should create its logger instance with a name specific to the&#10;controller for easy identification. For example, if the controller is named&#10;&lt;code&gt;ProtectedVolumeReplicationGroupList&lt;/code&gt;, the logger name could be a shortened&#10;form of the controller like &lt;code&gt;pvrgl&lt;/code&gt;.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pvrgl&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Loggers should be enriched with key contextual information to make the logs&#10;more informative. This includes:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;The name of the custom resource.&lt;/li&gt;&#10;&lt;li&gt;Then namespace of the custom resource, if applicable.&lt;/li&gt;&#10;&lt;li&gt;The UID of the custom resource.&lt;/li&gt;&#10;&lt;li&gt;The version of the custom resource.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NamespacedName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;rid&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ObjectMeta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;UID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ObjectMeta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ResourceVersion&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;The context passed to functions should be augmented with the logger instance:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LoggerInto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will be useful when we call functions that are outside of the controller&#10;scope and the instance.log object is not available to them.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>drenv metrics</title><link>https://ramendr.github.io/ramen/docs/drenv/metrics/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/drenv/metrics/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="drenv-metrics"&gt;drenv metrics&lt;/h1&gt;&#10;&lt;p&gt;The &lt;code&gt;drenv stress-test report&lt;/code&gt; command automatically collects system metrics&#10;from Netdata if it is running. This is important to correlate test failures to&#10;system load.&lt;/p&gt;&#10;&lt;h2 id="installing-netdata"&gt;Installing Netdata&lt;/h2&gt;&#10;&lt;p&gt;macOS:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;brew install netdata&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Linux:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;curl --fail --silent --show-error --location --output /tmp/netdata-kickstart.sh \&#10; https://get.netdata.cloud/kickstart.sh&#10;bash /tmp/netdata-kickstart.sh --no-updates --stable-channel&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="configuring-netdata"&gt;Configuring netdata&lt;/h2&gt;&#10;&lt;p&gt;For stress testing, configure Netdata to use minimal resources and store data on&#10;disk (persists across restarts, uses less memory).&lt;/p&gt;</description></item><item><title>Metrics</title><link>https://ramendr.github.io/ramen/docs/metrics/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/metrics/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="metrics"&gt;Metrics&lt;/h1&gt;&#10;&lt;p&gt;Metrics are collected using Prometheus, and registered with its global metrics&#10;registry in each controller. There are two ways where you can look at the&#10;metrics in ramen. One way is use prometheus stack(recommended) and the other way&#10;is to use curl or postman. More details on each of these in the below sections.&lt;/p&gt;&#10;&lt;p&gt;More information on metrics is&#10;&lt;a href="https://book.kubebuilder.io/reference/metrics.html"&gt;here&lt;/a&gt;&#10;&lt;/p&gt;&#10;&lt;h2 id="1-using-prometheus-stack"&gt;1. Using Prometheus Stack&lt;/h2&gt;&#10;&lt;p&gt;We recommend to use&#10;&lt;a href="https://github.com/prometheus-operator/kube-prometheus"&gt;kube-prometheus&lt;/a&gt;&#10;.&#10;Installing this will give you a containerized stack that includes Prometheus,&#10;AlertManager and Grafana.&lt;/p&gt;</description></item><item><title>Testing</title><link>https://ramendr.github.io/ramen/docs/testing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/testing/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="testing"&gt;Testing&lt;/h1&gt;&#10;&lt;h2 id="unit-tests-and-integration-tests"&gt;Unit tests and Integration tests&lt;/h2&gt;&#10;&lt;p&gt;The unit and integration tests for the controller code are written using the&#10;&lt;code&gt;ginkgo&lt;/code&gt; and &lt;code&gt;gomega&lt;/code&gt; testing frameworks. The tests are written in the&#10;&lt;code&gt;*_test.go&lt;/code&gt; files in the &lt;code&gt;controllers&lt;/code&gt; directory.&lt;/p&gt;&#10;&lt;p&gt;By default, the tests are run against a single kubernetes api&#10;server(&lt;a href="https://github.com/kubernetes-sigs/controller-runtime/tree/main/tools/setup-envtest"&gt;https://github.com/kubernetes-sigs/controller-runtime/tree/main/tools/setup-envtest&lt;/a&gt;&#10;)&#10;provided by the controller-runtime project.&lt;/p&gt;&#10;&lt;p&gt;The test framework uses mock interfaces for the components that aren&amp;rsquo;t installed&#10;in the test environment, like ocm, s3 and csi. These mock interfaces are used to&#10;fake a success or failure from the components to test the controller code.&lt;/p&gt;</description></item><item><title>End to End testing</title><link>https://ramendr.github.io/ramen/docs/e2e/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/e2e/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="end-to-end-testing"&gt;End to End testing&lt;/h1&gt;&#10;&lt;p&gt;RamenDR end-to-end (e2e) tests validate various scenarios for regional DR using&#10;predefined workloads and deployment methods.&lt;/p&gt;&#10;&lt;h2 id="running-end-to-end-tests"&gt;Running End to End tests&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;[!IMPORTANT]&#10;All commands must be ran from the e2e directory.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h3 id="preparing-a-configyaml-file"&gt;Preparing a &lt;code&gt;config.yaml&lt;/code&gt; file&lt;/h3&gt;&#10;&lt;h4 id="for-drenv-environment"&gt;For drenv environment&lt;/h4&gt;&#10;&lt;p&gt;If &lt;code&gt;drenv&lt;/code&gt; was used to configure RDR clusters, easily copy &lt;code&gt;config.yaml.sample&lt;/code&gt;&#10;and add the clusters kubeconfig paths into &lt;code&gt;config.yaml&lt;/code&gt; using:&lt;/p&gt;</description></item><item><title>Building ramen</title><link>https://ramendr.github.io/ramen/docs/build/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/build/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="building-ramen"&gt;Building ramen&lt;/h1&gt;&#10;&lt;h2 id="go-toolchain"&gt;Go toolchain&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;Ramen&lt;/em&gt; uses Go&amp;rsquo;s &lt;a href="https://go.dev/doc/toolchain"&gt;toolchain management&lt;/a&gt;&#10; to&#10;specify both the minimum required Go version and the recommended toolchain&#10;version in &lt;code&gt;go.mod&lt;/code&gt;:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;The &lt;code&gt;go&lt;/code&gt; directive specifies the minimum Go version required to build &lt;em&gt;Ramen&lt;/em&gt;.&lt;/li&gt;&#10;&lt;li&gt;The &lt;code&gt;toolchain&lt;/code&gt; directive specifies the recommended Go toolchain for&#10;development. By default, Go automatically downloads this version when a newer&#10;toolchain is needed.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="building-with-an-older-go-toolchain"&gt;Building with an older Go toolchain&lt;/h3&gt;&#10;&lt;p&gt;If you are building in a disconnected environment or with a Go version older&#10;than the &lt;code&gt;toolchain&lt;/code&gt; directive, set &lt;code&gt;GOTOOLCHAIN&lt;/code&gt; to use the locally installed&#10;Go toolchain:&lt;/p&gt;</description></item><item><title>DRPolicy CRD</title><link>https://ramendr.github.io/ramen/docs/drpolicy-crd/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/drpolicy-crd/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="drpolicy-crd"&gt;DRPolicy CRD&lt;/h1&gt;&#10;&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;&#10;&lt;p&gt;The &lt;strong&gt;DRPolicy&lt;/strong&gt; custom resource defines the disaster recovery topology and&#10;replication configuration between peer clusters. It is a cluster-scoped resource&#10;created by administrators on the OCM hub cluster that establishes the DR&#10;relationship between two managed clusters.&lt;/p&gt;&#10;&lt;p&gt;A DRPolicy specifies:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Which two clusters participate in DR&lt;/li&gt;&#10;&lt;li&gt;The replication schedule for Async (Regional DR)&lt;/li&gt;&#10;&lt;li&gt;Storage class selectors for volume replication&lt;/li&gt;&#10;&lt;li&gt;Whether to use async (Regional DR) or sync (Metro DR)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Lifecycle:&lt;/strong&gt; DRPolicy resources are created once during DR setup and are&#10;typically long-lived.&lt;/p&gt;</description></item><item><title>DRCluster CRD</title><link>https://ramendr.github.io/ramen/docs/drcluster-crd/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/drcluster-crd/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="drcluster-crd"&gt;DRCluster CRD&lt;/h1&gt;&#10;&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;&#10;&lt;p&gt;The &lt;strong&gt;DRCluster&lt;/strong&gt; custom resource represents a managed cluster registered for&#10;disaster recovery operations. It is a cluster-scoped resource created by&#10;administrators on the OCM hub cluster that provides:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;S3 configuration for storing PV metadata and cluster state&lt;/li&gt;&#10;&lt;li&gt;Network fencing configuration for Sync (Metro)&lt;/li&gt;&#10;&lt;li&gt;Cluster availability and fencing status&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;DRClusters are referenced by DRPolicy resources to define which clusters&#10;participate in DR relationships. Each managed cluster that participates in DR&#10;must have a corresponding DRCluster resource on the hub.&lt;/p&gt;</description></item><item><title>DRClusterConfig CRD</title><link>https://ramendr.github.io/ramen/docs/drclusterconfig-crd/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/drclusterconfig-crd/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="drclusterconfig-crd"&gt;DRClusterConfig CRD&lt;/h1&gt;&#10;&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;&#10;&lt;p&gt;The &lt;strong&gt;DRClusterConfig&lt;/strong&gt; custom resource provides cluster-specific disaster&#10;recovery configuration on managed clusters. It is a cluster-scoped resource that&#10;exists on each managed cluster (not on the hub) and serves two primary purposes:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Configuration Communication&lt;/strong&gt;: Conveys the cluster identity and desired&#10;replication schedules from the hub to the managed cluster&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Capability Discovery&lt;/strong&gt;: Scans the cluster for storage-related classes&#10;(StorageClass, VolumeSnapshotClass, VolumeReplicationClass, etc.) that have&#10;the required Ramen labels/annotations and reports them in its status. See the&#10;Status Fields section below for the specific label/annotation requirements&#10;for each class type.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; DRClusterConfig does not create these classes. Storage providers or&#10;administrators must create and label/annotate the classes appropriately.&#10;DRClusterConfig only discovers and reports them in its status.&lt;/p&gt;</description></item><item><title>DRPlacementControl CRD</title><link>https://ramendr.github.io/ramen/docs/drpc-crd/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/drpc-crd/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="drplacementcontrol-crd"&gt;DRPlacementControl CRD&lt;/h1&gt;&#10;&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;&#10;&lt;p&gt;The &lt;strong&gt;DRPlacementControl&lt;/strong&gt; (DRPC) custom resource is the primary interface for&#10;protecting and managing applications with disaster recovery capabilities.&#10;Created by users in the application namespace on the OCM hub cluster, it&#10;orchestrates:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Initial DR protection of applications deployed on the preferred cluster&lt;/li&gt;&#10;&lt;li&gt;Failover operations to peer clusters during disasters&lt;/li&gt;&#10;&lt;li&gt;Planned relocation between clusters&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;The DRPC is the control plane for application DR - it creates and manages&#10;VolumeReplicationGroup (VRG) resources on managed clusters via ManifestWork,&#10;coordinates with OCM Placement, and tracks DR state.&lt;/p&gt;</description></item><item><title>VolumeReplicationGroup CRD</title><link>https://ramendr.github.io/ramen/docs/vrg-crd/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/vrg-crd/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="volumereplicationgroup-crd"&gt;VolumeReplicationGroup CRD&lt;/h1&gt;&#10;&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;&#10;&lt;p&gt;The &lt;strong&gt;VolumeReplicationGroup&lt;/strong&gt; (VRG) custom resource manages volume replication&#10;and Kubernetes object protection for an application on a managed cluster. VRGs&#10;are &lt;strong&gt;not directly created by users&lt;/strong&gt; - they are automatically created and&#10;managed by the DRPlacementControl (DRPC) on the hub cluster via ManifestWork.&lt;/p&gt;&#10;&lt;p&gt;A VRG controls:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Volume replication state (Primary/Secondary) for all PVCs matching the&#10;selector&lt;/li&gt;&#10;&lt;li&gt;VolumeReplication or VolSync resource creation and management for data&#10;replication&lt;/li&gt;&#10;&lt;li&gt;PV metadata storage in S3 for cross-cluster recovery&lt;/li&gt;&#10;&lt;li&gt;Kubernetes object capture and recovery (via Velero and Recipe)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Lifecycle:&lt;/strong&gt; Created by DRPC when enabling DR protection. Exists on the active&#10;cluster as Primary and on the peer cluster as Secondary. Deleted when DRPC is&#10;removed.&lt;/p&gt;</description></item><item><title>MaintenanceMode CRD</title><link>https://ramendr.github.io/ramen/docs/maintenancemode-crd/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/maintenancemode-crd/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="maintenancemode-crd"&gt;MaintenanceMode CRD&lt;/h1&gt;&#10;&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;&#10;&lt;p&gt;The &lt;strong&gt;MaintenanceMode&lt;/strong&gt; custom resource enables coordination between Ramen and&#10;storage backends during disaster recovery operations. It is a cluster-scoped&#10;resource created by Ramen on managed clusters to signal storage providers that&#10;specific maintenance actions are required before proceeding with DR operations.&lt;/p&gt;&#10;&lt;p&gt;Storage backends use MaintenanceMode to:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Prepare storage systems for failover operations&lt;/li&gt;&#10;&lt;li&gt;Perform necessary cleanup or synchronization&lt;/li&gt;&#10;&lt;li&gt;Report readiness back to Ramen&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;This allows storage providers to integrate custom logic into Ramen&amp;rsquo;s DR&#10;workflows without Ramen needing to know storage-specific implementation details.&lt;/p&gt;</description></item><item><title>CephFS Regional DR Consistency Group</title><link>https://ramendr.github.io/ramen/docs/design/cephfs-rdr-consistencygroup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/design/cephfs-rdr-consistencygroup/</guid><description>&lt;h1 id="cephfs-regional-dr-consistency-group"&gt;CephFS Regional DR Consistency Group&lt;/h1&gt;&#10;&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;&#10;&lt;p&gt;Currently, Ramen only supports non-consistency-group CephFS RDR (Regional&#10;Disaster Recovery). However, with the upcoming support for consistency groups in&#10;CephFS, Ramen can expand its capabilities to include consistency-group RDR for&#10;CephFS.&lt;/p&gt;&#10;&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;&#10;&lt;p&gt;Consistency Groups are pivotal in maintaining data integrity during&#10;synchronizing related datasets across regions, mitigating the risk of data&#10;corruption or loss during failover events. They constitute essential components&#10;of Regional Disaster Recovery, enabling organizations to minimize risks and&#10;ensure the availability and integrity of their data across geographical&#10;locations.&lt;/p&gt;</description></item><item><title>drenv stress test</title><link>https://ramendr.github.io/ramen/docs/drenv/stress-test/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/drenv/stress-test/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="drenv-stress-test"&gt;drenv stress test&lt;/h1&gt;&#10;&lt;p&gt;The drenv stress test evaluates &lt;code&gt;drenv start&lt;/code&gt; robustness and helps debug failed&#10;runs.&lt;/p&gt;&#10;&lt;h2 id="setup"&gt;Setup&lt;/h2&gt;&#10;&lt;p&gt;Before running stress tests install &lt;em&gt;Netdata&lt;/em&gt; on the host to allow correlating&#10;test failures with system load. See &lt;a href="https://ramendr.github.io/ramen/docs/drenv/metrics/"&gt;metrics&lt;/a&gt;&#10; for more&#10;info.&lt;/p&gt;&#10;&lt;h2 id="running-stress-test"&gt;Running stress test&lt;/h2&gt;&#10;&lt;p&gt;In this example we run 100 runs starting the regional-dr environment. If a run&#10;fails, we delete the clusters and continue. This is useful for understanding&#10;what are the most common failures.&lt;/p&gt;</description></item><item><title>Global VolumeGroupReplication Design Document</title><link>https://ramendr.github.io/ramen/docs/design/global-vgr-design-doc/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/design/global-vgr-design-doc/</guid><description>&lt;h1 id="global-volumegroupreplication-design-document"&gt;Global VolumeGroupReplication Design Document&lt;/h1&gt;&#10;&lt;h2 id="1-design"&gt;1. Design&lt;/h2&gt;&#10;&lt;p&gt;Some storage backends manage replication at the LUN or filesystem level, where&#10;all applications sharing the same storage unit belong to a single replication&#10;group and must transition state together. Global VGR builds on top of Ramen&amp;rsquo;s&#10;offloaded storage support to coordinate a shared VGR across all VRGs in such a&#10;replication group, with multi-level consensus, label propagation, status&#10;validation, watchers, and observability through conditions, metrics, and alerts.&lt;/p&gt;</description></item><item><title>Handling CVEs in the project</title><link>https://ramendr.github.io/ramen/docs/dev/cve/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/dev/cve/</guid><description>&lt;h1 id="handling-cves-in-the-project"&gt;Handling CVEs in the project&lt;/h1&gt;&#10;&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;CVE, short for Common Vulnerabilities and Exposures, is a list of publicly&#10;disclosed computer security flaws. When someone refers to a CVE, they mean a&#10;security flaw that&amp;rsquo;s been assigned a CVE ID number.&lt;/p&gt;&#10;&lt;h2 id="cves-filed-on-dependencies"&gt;CVEs filed on dependencies&lt;/h2&gt;&#10;&lt;h3 id="checking-if-a-cve-applies-to-ramen"&gt;Checking if a CVE applies to Ramen&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Ramen has two go modules, one for the main project and another for the&#10;api. You need to perform the check below for both the modules.&lt;/p&gt;</description></item><item><title>Incremental Sync for Consistency Groups</title><link>https://ramendr.github.io/ramen/docs/design/incremental-sync/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/design/incremental-sync/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="incremental-sync-for-consistency-groups"&gt;Incremental Sync for Consistency Groups&lt;/h1&gt;&#10;&lt;p&gt;Extends &lt;a href="https://ramendr.github.io/ramen/docs/design/cephfs-rdr-consistencygroup/"&gt;Cephfs-RDR-ConsistencyGroup.md&lt;/a&gt;&#10;.&lt;/p&gt;&#10;&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;&#10;&lt;p&gt;When &lt;code&gt;drplacementcontrol.ramendr.openshift.io/enable-diff: &amp;quot;true&amp;quot;&lt;/code&gt; is set on a&#10;DRPC, Ramen preserves VolumeGroupSnapshots across sync cycles and uses the&#10;&lt;a href="https://github.com/RamenDR/ceph-volsync-plugin"&gt;ceph-volsync-plugin&lt;/a&gt;&#10; External&#10;mover to transfer only changed blocks between consecutive snapshots.&lt;/p&gt;&#10;&lt;h2 id="annotation-propagation"&gt;Annotation Propagation&lt;/h2&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;DRPC → VRG → RGS (ReplicationGroupSource)&#10; → RGD (ReplicationGroupDestination)&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Follows the same flow as &lt;code&gt;UseVolSyncAnnotation&lt;/code&gt;: the user sets the annotation on&#10;the DRPC instance, which propagates it to the VRG via ManifestWork. The&#10;annotation is whitelisted in &lt;code&gt;constructVRGFromView&lt;/code&gt; so it survives hub&#10;round-trips. DRPC annotation changes trigger reconcile automatically via the&#10;default &lt;code&gt;For(&amp;amp;DRPlacementControl{})&lt;/code&gt; predicate.&lt;/p&gt;</description></item><item><title>VRG reconciler workflow</title><link>https://ramendr.github.io/ramen/docs/design/proposals/vrg-reconciliation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/design/proposals/vrg-reconciliation/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="vrg-reconciler-workflow"&gt;VRG reconciler workflow&lt;/h1&gt;&#10;&lt;p&gt;This design document covers the VRG CRD and its reconciliation workflow.&lt;/p&gt;&#10;&lt;h2 id="terminology"&gt;Terminology&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;VRG: VolumeReplicationGroup&lt;/li&gt;&#10;&lt;li&gt;VR: VolumeReplication&lt;/li&gt;&#10;&lt;li&gt;PVC: PersistentVolumeClaim&lt;/li&gt;&#10;&lt;li&gt;PV: PersistentVolume&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="vrg-operator-functionality"&gt;VRG operator functionality&lt;/h2&gt;&#10;&lt;p&gt;VRG resource exists to manage a group PVCs that need replication. It is a&#10;namespace level resource that ensures the following:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;For each existing or dynamically created PVC:&#10;&lt;ul&gt;&#10;&lt;li&gt;Ensures PVCs are protected from deletion, prior to replicating them&lt;/li&gt;&#10;&lt;li&gt;Ensures PVCs are bound before enabling replication for them&lt;/li&gt;&#10;&lt;li&gt;Ensures only PVCs that are NOT being deleted are protected, when reconciling&#10;them&lt;/li&gt;&#10;&lt;li&gt;Ensures PVs backing the PVCs are retained for the duration that they are&#10;protected&lt;/li&gt;&#10;&lt;li&gt;Backs up the PV cluster data to an external S3 store, to enable restoring&#10;them on a remote peer cluster&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Creates and manages VR resource for PVCs that need to be protected&lt;/li&gt;&#10;&lt;li&gt;Manages state changes in VRG by ensuring VRs reach the same desired state,&#10;coordinating with PVC state and ensuring:&#10;&lt;ul&gt;&#10;&lt;li&gt;PVCs are not in use when being marked Secondary&lt;/li&gt;&#10;&lt;li&gt;PVCs are marked for deletion when being marked Secondary&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Manages VRG deletion, by ensuring VRs are in the desired state prior to&#10;deletion&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="vrg-crd"&gt;VRG CRD&lt;/h2&gt;&#10;&lt;h3 id="spec"&gt;Spec&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;apiVersion: ramendr.openshift.io/v1alpha1&#10;kind: VolumeReplicationGroup&#10;metadata:&#10; name: vrg-sample&#10; generation: &amp;lt;generation&amp;gt;&#10;spec:&#10; pvcSelector:&#10; matchLabels:&#10; &amp;lt;key&amp;gt;: &amp;lt;value&amp;gt;&#10; volumeReplicationClass: &amp;lt;string&amp;gt;&#10; replicationState: &amp;#34;Primary&amp;#34;|&amp;#34;Secondary&amp;#34;&#10; s3Endpoint: &amp;lt;url-string&amp;gt;&#10; s3SecretName: &amp;lt;string&amp;gt;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#10;&lt;li&gt;Fields:&#10;&lt;ul&gt;&#10;&lt;li&gt;PVCSelector&#10;&lt;ul&gt;&#10;&lt;li&gt;Label selector to identify all the PVCs that are belong to this VRG and&#10;need to be replicated&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;VolumeReplicationClass&#10;&lt;ul&gt;&#10;&lt;li&gt;ReplicationClass for all volumes in this replication group; this value is&#10;propagated to created VolumeReplication CRs&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;ReplicationState&#10;&lt;ul&gt;&#10;&lt;li&gt;Desired state of all volumes [&lt;code&gt;primary&lt;/code&gt; or &lt;code&gt;secondary&lt;/code&gt;] in this&#10;replication group; this value is propagated to created VolumeReplication&#10;CRs&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;S3Profiles&#10;&lt;ul&gt;&#10;&lt;li&gt;S3 Profiles to replicate PV cluster data&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="status"&gt;Status&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;status:&#10; protectedPVCs: [&#10; pvcName: &amp;lt;string&amp;gt;&#10; conditions: [&#10; type: [&amp;#34;Available&amp;#34;]&#10; status: [true|false|unknown]&#10; observedGeneration: &amp;lt;generation&amp;gt;&#10; lastTransitionTime: &amp;lt;time&amp;gt;&#10; reason: &amp;#34;Error&amp;#34;|&amp;#34;Progressing&amp;#34;|&amp;#34;Replicating&amp;#34;&#10; message: &amp;lt;human readable string&amp;gt;&#10; ]&#10; ]&#10; conditions: [&#10; type: [&amp;#34;Available&amp;#34;]&#10; status: [true|false|unknown]&#10; observedGeneration: &amp;lt;generation&amp;gt;&#10; lastTransitionTime: &amp;lt;time&amp;gt;&#10; reason: [&amp;#34;Replicating&amp;#34;|&amp;#34;Progressing&amp;#34;|&amp;#34;Error&amp;#34;]&#10; message: &amp;lt;human readable string&amp;gt;&#10; ]&#10;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;status.conditions&lt;/code&gt;:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;type&lt;/code&gt; &amp;ldquo;Available&amp;rdquo; is to denote availability status of the VRG resource&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; &lt;code&gt;status&lt;/code&gt; may change back to &amp;ldquo;Progressing&amp;rdquo; in case there are new&#10;PVCs to deal with for the same CRD &lt;code&gt;generation&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;status&lt;/code&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&amp;ldquo;Unknown&amp;rdquo; if VRG is not yet picked up for reconciliation&lt;/li&gt;&#10;&lt;li&gt;&amp;ldquo;True&amp;rdquo; if reconciliation is completed&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;reason&lt;/code&gt; is &amp;ldquo;Replicating&amp;rdquo;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&amp;ldquo;False&amp;rdquo; if reconciliation is progressing or has errors&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;reason&lt;/code&gt;: Progressing|Error&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;status.protectedPVCs&lt;/code&gt;:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;pvcName&lt;/code&gt;: Name of the PVC for which conditions are represented&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;conditions&lt;/code&gt;:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;type&lt;/code&gt; &amp;ldquo;Available&amp;rdquo; is to denote availability status for PVC protection&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;status&lt;/code&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&amp;ldquo;True&amp;rdquo; if &lt;code&gt;reason&lt;/code&gt; is &amp;ldquo;Replicating&amp;rdquo;&lt;/li&gt;&#10;&lt;li&gt;&amp;ldquo;False&amp;rdquo; if &lt;code&gt;reason&lt;/code&gt; is one of &amp;ldquo;Error&amp;rdquo; or &amp;ldquo;Progressing&amp;rdquo;, to denote any&#10;hard errors or that reconciliation is in progress&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;NOTE(s):&lt;/strong&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Ideally if status.conditions.[Available].status is True, the all PVC&#10;status should be true, with the reason as &amp;ldquo;Replicating&amp;rdquo;&lt;/li&gt;&#10;&lt;li&gt;An &lt;code&gt;observedGeneration&lt;/code&gt; number for when the PVC was protected may not be&#10;required, as once it is protected it stays protected. It may prove&#10;useful though if any straggling PVCs were protected during a cluster&#10;heal or related operations, to detect prior failover PVCs with the&#10;current generation&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="notes"&gt;Notes&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Status may change for the same observed generation, as PVCs are created&lt;/li&gt;&#10;&lt;li&gt;Should there be a per PVC condition that it&amp;rsquo;s backing PV was backed up? To&#10;denote that replication at storage maybe missing, but PV cluster data may&#10;exist?&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="vrg-example"&gt;VRG Example&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;---&#10;apiVersion: ramendr.openshift.io/v1alpha1&#10;kind: VolumeReplicationGroup&#10;metadata:&#10; name: vrg-sample&#10;spec:&#10; pvcSelector:&#10; matchLabels:&#10; appname: myapp&#10; volumeReplicationClass: &amp;#34;vr-class-sample&amp;#34;&#10; replicationState: &amp;#34;Primary&amp;#34;&#10; s3Profiles:&#10; s3ProfileEast&#10; s3ProfileWest&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="vrg-reconciliation"&gt;VRG reconciliation&lt;/h2&gt;&#10;&lt;h3 id="pvc-preparation-and-protection-for-all-states"&gt;PVC preparation and protection for all states&lt;/h3&gt;&#10;&lt;p&gt;All reconciliation state changes need to ensure a PVC is in the right state and&#10;protected prior to proceeding with the state change. The following steps are&#10;taken to ensure the same:&lt;/p&gt;</description></item><item><title>VRG Type Sequence</title><link>https://ramendr.github.io/ramen/docs/design/vrg-typesequence/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ramendr.github.io/ramen/docs/design/vrg-typesequence/</guid><description>&lt;!--&#10;SPDX-FileCopyrightText: The RamenDR authors&#10;SPDX-License-Identifier: Apache-2.0&#10;--&gt;&#10;&lt;h1 id="vrg-type-sequence"&gt;VRG Type Sequence&lt;/h1&gt;&#10;&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;&#10;&lt;p&gt;RamenDR can use Velero to capture Kubernetes object information. By default,&#10;Velero will back up all object types in arbitrary order. However, many&#10;applications have internal dependencies that require specific ordering by object&#10;type. The VRG Type Sequencer attempts to address this deficiency by taking&#10;multiple partial backups, with the order defined a the user.&lt;/p&gt;&#10;&lt;h2 id="example-use-case-backup"&gt;Example Use Case: Backup&lt;/h2&gt;&#10;&lt;h3 id="backup-overview"&gt;Backup Overview&lt;/h3&gt;&#10;&lt;p&gt;Take an example Backup that requires the following sequence:&lt;/p&gt;</description></item></channel></rss>