Skip to content

Commit

Permalink
Merge pull request #2 from deckhouse/migrate-code
Browse files Browse the repository at this point in the history
Migrate code from gitlab
  • Loading branch information
AleksZimin authored Dec 27, 2023
2 parents 878fcff + 8828631 commit a29f743
Show file tree
Hide file tree
Showing 9 changed files with 192 additions and 13 deletions.
1 change: 0 additions & 1 deletion crds/blockdevices.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,6 @@ spec:
name: Path
type: string
description: Actual device path (name).
priority: 1
- jsonPath: .status.actualVGNameOnTheNode
name: VG
type: string
Expand Down
9 changes: 4 additions & 5 deletions crds/lvmvolumegroup.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -87,11 +87,11 @@ spec:
type: string
description: |
The global state of the Volume Group. Might be:
- Operational (if everything is fine)
- NonOperational (if there are some problems in the volume group)
enum:
- Operational (if everything is fine with the Volume Group)
- NonOperational (if there are some problems with the Volume Group)
- NonOperational (if there are some problems in the Volume Group)
enum:
- Operational
- NonOperational
message:
type: string
description: |
Expand Down Expand Up @@ -192,7 +192,6 @@ spec:
name: VG
type: string
description: Actual VG name.
priority: 1
- jsonPath: .spec.type
name: type
type: string
Expand Down
14 changes: 14 additions & 0 deletions docs/CONFIGURATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
title: "The Sds-Node-Configurator module: settings"
---
{% alert level="warning" %}
The module is guaranteed to work in the following cases only:
- if stock kernels shipped with [supported distributions](../../supported_versions.html#linux) are used;
- if a 10Gbps network is used.

As for any other configurations, the module may work, but its smooth operation is not guaranteed.
{% endalert %}

{% include module-bundle.liquid %}

No configuration on the user's side is required
70 changes: 70 additions & 0 deletions docs/FAQ.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
---
title: "The SDS-Node-Configurator module: FAQ"
description: "Common questions and answers."
---
{% alert level="warning" %}
The module is guaranteed to work in the following cases only:
- if stock kernels shipped with the [supported distributions](../../supported_versions.html#linux) are used;
- if a 10Gbps network is used.

As for any other configurations, the module may work, but its smooth operation is not guaranteed.
{% endalert %}

## Why does creating `BlockDevice` and `LVMVolumeGroup` resources in a cluster fail?

* In most cases, the creation of `BlockDevice` resources fails because the existing devices fail filtering by the controller. Please make sure that your devices meet the [requirements](link to requirements).

* Creating `LVMVolumeGroup` resources may fail due to the missing `BlockDevice` resources, as they use them as the data source.

* If the `BlockDevice` resources are present and the `LVMVolumeGroup` resources are not present, please make sure the existing `Volume Group` has a special tag `storage.deckhouse.io/enabled=true` attached.

## I have deleted the `LVMVolumeGroup` resource, but the `Volume Group` is still there. What do I do?

Deleting a `LVMVolumeGroup` resource does not delete the `Volume Group` it references. To delete it,
add a special `storage.deckhouse.io/sds-delete-vg: ""` annotation to trigger the deletion process. The controller will then automatically delete the
`Volume Group` and its associated resource.

> Note thatSimply deleting the `LVMVolumeGroup` resource will result in the creation of a new resource with a generated name based on the existing `Volume Group`.
## I have attached the delete annotation, but the `LVMVolumeGroup` resource is still there as well as the `Volume Group` on the node. Why?

The usual case is that there are `Logical Volumes` for the `Volume Group` the resource references. The controller does not delete `Logical Volumes` because these `volumes` may contain data and the user must purge them manually.

Once the `Logical Volume` has been deleted, the controller will proceed to delete the `Volume Group` and its corresponding resource.

> The time it takes to delete may be longer if the controller's reconcile queue is crowded with other events. To delete the `Volume Group` and its linked resource immediately, update the delete annotation, e. g., by adding any number to its value: `storage.deckhouse.io/sds-delete-vg: ""` -> `storage.deckhouse.io/sds-delete-vg: "1"`.
> In this case, it will be deleted immediately.
## I'm trying to create a `Volume Group` using the `LVMVolumeGroup` resource, but I'm not getting anywhere. Why?

Most likely, your resource fails controller validation.
The exact cause of the failure can be found in the `Status.Message` field of the resource itself,
or you can refer to the controller's logs.

> The problem usually stems from incorrectly defined `BlockDevice` resources. Please make sure that these resources meet the following requirements:
> - The `Consumable` field is set to `true`.
> - For a `Volume Group` of type `Local`, the specified `BlockDevice` belong to the same node.
> - For a `Volume Group` of type `Shared`, the specified `BlockDevice` is the only resource.
> - The selected `BlockDevice` does not share other `LVMVolumeGroup` resources (other `Volume Groups`).
> - The current names of the `BlockDevice` resources are specified.
> The full list of expected values can be found in the [CR reference](link to the reference) of the `LVMVolumeGroup` resource.
## What happens if I unplug one of the devices in a `Volume Group`? Will the linked `LVMVolumeGroup` resource be deleted?

The `LVMVolumeGroup` resource will persist as long as the corresponding `Volume Group` exists. As long as at least one device exists, the `Volume Group` will be there, albeit in an unhealthy state.
Note that these issues will be reflected in the resource's `Status`.

When the unplugged device is reactivated, the `Volume Group` will recover while the linked `LVMVolumeGroup` resource be brought to its current state as well.

## How do I get the controller to stop monitoring the `Volume Group`?

Delete the `storage.deckhouse.io/enabled=true` tag for the target `Volume Group`. The controller will then stop tracking the selected `Volume Group` and delete the associated `LVMVolumeGroup` resource automatically.

## I haven't added the `storage.deckhouse.io/enabled=true` tag to the `Volume Group`, but it is there. How is this possible?

This is possible if you have created the `Volume group` using the `LVMVolumeGroup` resource (in this case, the controller will automatically add this tag to the created `Volume Group`) or if this `Volume Group` had the `Linstor` module tag (`linstor-*`).

The `sds-node-configurator` module replaces some of the functionality of the `linstor-pools-importer` controller of the built-in `Linstor` module.
So when you switch from the `Linstor` module to the `sds-node-configurator` and `sds-drbd` modules, the `linstor-*` tags are automatically replaced with the `storage.deckhouse.io/enabled=true` tag in the `Volume Group`. This way, the `sds-node-configurator` gets control of these `Volume Groups`.

> The controller performs a one-time re-tagging operation on all existing `Volume Groups` when it starts up.
88 changes: 88 additions & 0 deletions docs/USAGE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
---
title: "The SDS-Node-Configurator module: usage examples"
description: Usage and examples of the SDS-Node-Configurator controller operation.
---

{% alert level="warning" %}
The module is guaranteed to work in the following cases only:
- if stock kernels shipped with the [supported distributions](../../supported_versions.html#linux) are used;
- if a 10Gbps network is used.

As for any other configurations, the module may work, but its smooth operation is not guaranteed.
{% endalert %}

The controller supports two types of resources:
* `BlockDevice`;
* `LVMVolumeGroup`.

## [BlockDevice](block device) resources

### Creating a `BlockDevice` resource

The controller regularly scans the existing devices on the node. If a device meets all the conditions
imposed by the controller, a `BlockDevice` `custom resource` (CR) with a unique name is created.
It contains all the information about the device in question.

#### The conditions the controller imposes on the device

* The device is not a drbd device.
* The device is not a pseudo-device (i.e. not a loop device).
* The device is not a `Logical Volume`.
* File system is missing or matches LVM2_MEMBER.
* The block device has no partitions.
* The size of the block device is greater than 1 Gi.
* If the device is a virtual disk, it must have a serial number.

The controller will use the information from the custom resource to handle `LVMVolumeGroup` resources going forward.

### Updating a `BlockDevice` resource

The controller updates the information in the custom resource independently if the state of the block device it refers to has changed.

### Deleting a `BlockDevice` resource

The following are the cases in which the controller will automatically delete a resource if the block device it refers to has become unavailable:
* if the resource had a Consumable status;
* if the block device belongs to a `Volume Group` that does not have the tag `storage.deckhouse.io/enabled=true` attached to it (this `Volume Group` is not managed by our controller).


> The controller performs the above activities automatically and requires no user intervention.
## [LVMVolumeGroup](lvmVolumeGroup) resources

The `BlockDevice` resources are required to create and update `LVMVolumeGroup` resources.

The `LVMVolumeGroup` resources are designed to communicate with the `Volume Group` and display up-to-date information about their state.

### Creating a `LVMVolumeGroup` resource and a `Volume Group`

There are two ways to create a `LVMVolumeGroup` resource:
* Automatically:
* The controller automatically scans for information about the existing `Volume Groups` on nodes and creates a resource
if a `Volume Group` is tagged with `storage.deckhouse.io/enabled=true` and there is no matching resource for it.
* In this case, the controller populates all fields of the resource on its own.
* By the user:
* The user manually creates the resource by filling in only the `Spec` field. In it, they specify the desired state of the new `Volume Group`.
* This information is then validated to ensure that the configuration provided is correct and can be implemented.
* After successful validation, the controller uses the provided information to create the specified `Volume Group` and update the user resource with the actual information about the state of the created `Volume Group`.

### Updating a `LVMVolumeGroup` resource and a `Volume Group`

The controller automatically updates the `Status` field of the `LVMVolumeGroup` with the current data about the `Volume Group` in question.
We do **not recommend** making manual changes to the `Status` field.

> The controller does not update the `Spec` field since it represents the desired state of the `Volume Group`. The user can make changes to the `Spec` field to change the state of the `Volume Group`.
### Deleting a `LVMVolumeGroup` resource and a `Volume Group`

The controller will automatically delete a resource if the `Volume Group` it references has become unavailable.

> The user may delete a resource manually. However, if the corresponding `Volume Group` still exists at the moment the resource is deleted,
> the controller will create a resource *automatically* based on the existing `Volume Group`
> and assign it a new generated name.
To delete a `Volume Group` and its associated `Physical Volume`, append the `storage.deckhouse.io/sds-delete-vg: ""` annotation to the corresponding `LVMVolumeGroup` resource.

The controller will detect that the annotation has been added and initiate the process of deleting the `Volume Group` and its parts.

This will result in the `Volume Group` being deleted, as well as its associated `Physical Volume`, and the `LVMVolumeGroup` resource (**if there is no `Logical Volume`** on the `Volume Group`**). If there is a `Logical Volume` on the `Volume Group`, the user must first manually delete the `Logical Volume` on the node.
2 changes: 1 addition & 1 deletion images/agent/internal/const.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const (
AvailableBlockDevice = "available_block_device"
SdsNodeConfigurator = "storage.deckhouse.io/sds-node-configurator"
LVMVGHealthOperational = "Operational"
LVMVGHealthNonOperational = "Nonoperational"
LVMVGHealthNonOperational = "NonOperational"
)

var (
Expand Down
17 changes: 13 additions & 4 deletions images/agent/pkg/controller/block_device.go
Original file line number Diff line number Diff line change
Expand Up @@ -192,8 +192,7 @@ func RemoveDeprecatedAPIDevices(
}

for name, device := range apiBlockDevices {
if checkAPIBlockDeviceDeprecated(name, actualCandidates) &&
device.Status.NodeName == nodeName {
if shouldDeleteBlockDevice(device, actualCandidates, nodeName) {
err := DeleteAPIBlockDevice(ctx, cl, metrics, name)
if err != nil {
log.Error(err, fmt.Sprintf("[RunBlockDeviceController] unable to delete APIBlockDevice, name: %s", name))
Expand All @@ -206,8 +205,18 @@ func RemoveDeprecatedAPIDevices(
}
}

func checkAPIBlockDeviceDeprecated(apiDeviceName string, actualCandidates map[string]struct{}) bool {
_, ok := actualCandidates[apiDeviceName]
func shouldDeleteBlockDevice(bd v1alpha1.BlockDevice, actualCandidates map[string]struct{}, nodeName string) bool {
if bd.Status.NodeName == nodeName &&
bd.Status.Consumable &&
isBlockDeviceDeprecated(bd.Name, actualCandidates) {
return true
}

return false
}

func isBlockDeviceDeprecated(blockDevice string, actualCandidates map[string]struct{}) bool {
_, ok := actualCandidates[blockDevice]
return !ok
}

Expand Down
2 changes: 1 addition & 1 deletion images/agent/pkg/controller/watcher_lvm_volume_group.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ func RunWatcherLVMVGController(
log.Warning(fmt.Sprintf(`Added request, namespace: "%s" name: "%s", to requeue`, request.Namespace, request.Name))
return reconcile.Result{
RequeueAfter: cfg.VolumeGroupScanInterval * time.Second,
}, err
}, nil
}
log.Info(fmt.Sprintf(`Reconcile of RunWatcherLVMVGController on request, name: "%s" ends`, request.Name))

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ const (

Failed = "Failed"

NoOperational = "Nonoperational"
NoOperational = "NonOperational"
Operational = "Operational"

delAnnotation = "storage.deckhouse.io/sds-delete-vg"
Expand Down

0 comments on commit a29f743

Please sign in to comment.