Skip to content

Commit 754a1c3

Browse files
bveredtyichye19alonfiresteinrivkap
authored
Release 1.3.0 (#64)
* update release version * Update go.mod * update release version * add logical capacity calcs for all pools and refactor collectPoolMetrics function Signed-off-by: Tal Yichye <tal.yichye@ibm.com> * add physical metrics for child pools Signed-off-by: Tal Yichye <tal.yichye@ibm.com> * Fix storagesystem physical calc (#36) * add system physical capacity usage Signed-off-by: Vered Berenstein Paz <BVERED@il.ibm.com> * Bump version to 1.3.0 Change driver version to 1.3.0. Signed-off-by: 662962756 <bvered@il.ibm.com> * action: changes to go.mod and go.sum files do not inflict problems to… (#42) * action: changes to go.mod and go.sum files do not inflict problems to the build Signed-off-by: Alon Firestein <alon.firestein@ibm.com> * Add support for multiple StorageSystems (#43) * add support for multiple storagesystems * add Copyright header to new files * add updated operator version tag to go.mod * fix log error prints * fix false-positive golangci issue * Collect pools metrics only if pool exist & Update storage credentials when needed (#44) * update storage credentials upon secret change * disable commitlint github action Signed-off-by: Tal Yichye <tal.yichye@ibm.com> * Task/change warning threashold label (#45) * change warning capacity label * fix lssystem parsing * fix test * fix gosum and usage in operators function * fix logging Signed-off-by: Vered Berenstein <bvered@il.ibm.com> * fix capacity calcs (#46) * fix physical system and pool capacity calculations by adding reclaimable size * fix go mod * remove error var * fix gosum * remove non-exposed value. * Improve test Signed-off-by: 662962756 <bvered@il.ibm.com> * Handle errors with os.exit() instead of goto command (#47) * handle errors with os.exit instead of goto command * remove todos and stop collect capacity metrics in case of an error Signed-off-by: Tal Yichye <tal.yichye@ibm.com> * expose up metric as part of systemInfo metrics (#49) Signed-off-by: Tal Yichye <tal.yichye@ibm.com> * fix shared pointer bug (#50) Signed-off-by: Tal Yichye <tal.yichye@ibm.com> * upgrade prometheus client golang version to 1.13.0 (#51) Signed-off-by: 662962756 <bvered@il.ibm.com> * Add unit tests for multiple storage support metrics collection (#52) * add unit tests for multiple storage support metrics collection * add unit test for system capacity metrics Signed-off-by: Tal Yichye <tal.yichye@ibm.com> * check client state on existing manager (#53) * check client state on existing manager Signed-off-by: 662962756 <bvered@il.ibm.com> * update fsc status only if different from current status (#54) Signed-off-by: Tal Yichye <tal.yichye@ibm.com> * upgrade go and sub-packages versions Signed-off-by: 662962756 <bvered@il.ibm.com> * fix SA1019: "io/ioutil" has been deprecated since Go 1.16 Signed-off-by: 662962756 <bvered@il.ibm.com> * add unitests for rest module Signed-off-by: 662962756 <bvered@il.ibm.com> * add unitests for rest module Signed-off-by: 662962756 <bvered@il.ibm.com> * add unitests for rest module Signed-off-by: 662962756 <bvered@il.ibm.com> * add unitests for rest module Signed-off-by: 662962756 <bvered@il.ibm.com> * Update operator go mod version (#57) * update operator tag for go mod file * upgrade operator latest version Signed-off-by: 662962756 <bvered@il.ibm.com> * Calc physical and logical pool capacities by fixing reclaimable capacity calculations (#60) * Calc physical and logical pool capacities by fixing reclaimable capacity calculations * Calc physical storage capacity by fixing reclaimable calculation per pool * Error: S1002: should omit comparison to bool constant, can be simplified * fix tests * check if pool mdisks are compressed * check if pool mdisks are compressed * add a test section to calc reclamation for non-compressed drives * revert files * remove reclaimable-0 in case of external storage * rename variables * fix test * fix calculation * remove child-pool calc Signed-off-by: 662962756 <bvered@il.ibm.com> * Task/add warning for external stg (#61) * chedck if pool has external disks * check if storage has any external pool * fix test * expose external functions * Reduce usage of -isInternalStorage function * create PoolInfo data in flashsystem * add Mdisks list into Pool data * return from Collect in case of error * add compression data for poolInfo * refactor vars and functions names Signed-off-by: 662962756 <bvered@il.ibm.com> Signed-off-by: Tal Yichye <tal.yichye@ibm.com> * Docs release 1.3.0 (#58) * update operator tag for go mod file * upgrade operator latest version * Create configuring.dita * separated out limitations * updated naming * updated link * sorted into folders * added basic files for ibm docs * added trademark info * added related publications * Create configuring.dita * separated out limitations * updated naming * updated link * sorted into folders * added no translate rules * updated link to matrix page * updated welcome name * updated linking * updated what's new title * adding what's new info per Alon * added installing info * updated to show that it is new support * reworded for general support - not display specific * added breadcrumbs to installation * placed matrix in toc * fixed matrix linking * updated installation instructions per RM * updated typo in link * Update docs_whatsnew.dita * change docker.io/ibmcom to quay.io/ibmodffs (#62) * change docker.io/ibmcom to quay.io/ibmodffs * remove hub Signed-off-by: 662962756 <bvered@il.ibm.com> * change operator to 1.3.0 tag (#63) Signed-off-by: 662962756 <bvered@il.ibm.com> * Update docs_whatsnew.dita Signed-off-by: Vered Berenstein <bvered@il.ibm.com> --------- Signed-off-by: Tal Yichye <tal.yichye@ibm.com> Signed-off-by: Vered Berenstein Paz <BVERED@il.ibm.com> Signed-off-by: 662962756 <bvered@il.ibm.com> Signed-off-by: Alon Firestein <alon.firestein@ibm.com> Signed-off-by: Vered Berenstein <bvered@il.ibm.com> Co-authored-by: Tal Yichye <tal.yichye@ibm.com> Co-authored-by: Alon Firestein <57404551+alonfirestein@users.noreply.github.com> Co-authored-by: tyichye19 <84450119+tyichye19@users.noreply.github.com> Co-authored-by: rivkap <54570654+rivkap@users.noreply.github.com>
1 parent 9cf9df3 commit 754a1c3

File tree

25 files changed

+2136
-966
lines changed

25 files changed

+2136
-966
lines changed

.github/workflows/commitlint.yaml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
name: commitlint
22

3-
on:
4-
push:
5-
branches: [ '*' ]
6-
pull_request:
7-
branches: [ '*' ]
3+
on: workflow_dispatch
84

95
jobs:
106
commitlint:

.github/workflows/iso-ci.yaml

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ jobs:
1414
strategy:
1515
fail-fast: false
1616
matrix:
17-
go: ["1.16"]
17+
go: ["1.18"]
1818
steps:
19-
- uses: actions/setup-go@v2
19+
- uses: actions/setup-go@v3
2020
with:
2121
go-version: ${{ matrix.go }}
2222

23-
- uses: actions/checkout@v2
23+
- uses: actions/checkout@v3
2424
with:
2525
fetch-depth: 0
2626

@@ -32,13 +32,14 @@ jobs:
3232
run: |
3333
make check-copyright
3434
35-
- name: login to Docker Hub
35+
- name: login to Quay.io
3636
# Only if we need to push an image
3737
if: ${{ github.event_name == 'release' && github.event.action == 'published' }}
3838
uses: docker/login-action@v1
3939
with:
40-
username: ${{ secrets.DOCKERHUB_USERNAME }}
41-
password: ${{ secrets.DOCKERHUB_TOKEN }}
40+
registry: quay.io
41+
username: ${{ secrets.QUAYIO_USERNAME }}
42+
password: ${{ secrets.QUAYIO_TOKEN }}
4243

4344
# Setup for buildx
4445
- name: set up QEMU
@@ -67,4 +68,4 @@ jobs:
6768
# Only push if we are publishing a release
6869
push: ${{ github.event_name == 'release' && github.event.action == 'published' }}
6970
# Use a 'dev' tag, that won't be pushed, for non-release builds
70-
tags: docker.io/ibmcom/ibm-storage-odf-block-driver:${{ steps.tag.outputs.version-without-v || 'dev' }}
71+
tags: quay.io/ibmodffs/ibm-storage-odf-block-driver:${{ steps.tag.outputs.version-without-v || 'dev' }}

Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Build the manager binary
2-
FROM --platform=$BUILDPLATFORM golang:1.16 as builder
2+
FROM --platform=$BUILDPLATFORM golang:1.18 as builder
33

44
WORKDIR /workspace
55
# Copy the Go Modules manifests
@@ -20,7 +20,7 @@ LABEL vendor="IBM" \
2020
org.label-schema.vendor="IBM" \
2121
org.label-schema.name="ibm storage odf driver" \
2222
org.label-schema.vcs-url="https://github.com/IBM/ibm-storage-odf-block-driver" \
23-
org.label-schema.schema-version="1.0.1"
23+
org.label-schema.schema-version="1.3.0"
2424

2525
WORKDIR /
2626

Makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11

22
LINT_VERSION="1.40.0"
33

4-
IMAGE_REPO="docker.io"
5-
NAME_SPACE="ibmcom"
6-
DRIVER_IMAGE_VERSION=1.0.1
4+
IMAGE_REPO="quay.io"
5+
NAME_SPACE="ibmodffs"
6+
DRIVER_IMAGE_VERSION=1.3.0
77

88
DRIVER_NAME=ibm-storage-odf-block-driver
99

cmd/manager/main.go

Lines changed: 34 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -18,155 +18,67 @@ package main
1818

1919
import (
2020
"fmt"
21-
"os"
22-
"os/signal"
23-
"syscall"
24-
25-
"k8s.io/klog"
26-
27-
"k8s.io/apimachinery/pkg/runtime"
28-
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
29-
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
30-
31-
drivermanager "github.com/IBM/ibm-storage-odf-block-driver/pkg/driver"
21+
clientmanagers "github.com/IBM/ibm-storage-odf-block-driver/pkg/managers"
3222
"github.com/IBM/ibm-storage-odf-block-driver/pkg/prome"
3323
"github.com/IBM/ibm-storage-odf-block-driver/pkg/rest"
3424
operatorapi "github.com/IBM/ibm-storage-odf-operator/api/v1alpha1"
35-
operutil "github.com/IBM/ibm-storage-odf-operator/controllers/util"
25+
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
26+
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
27+
log "k8s.io/klog"
28+
"os"
29+
"os/signal"
30+
"syscall"
3631
)
3732

38-
var scheme = runtime.NewScheme()
39-
40-
func init() {
41-
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
42-
utilruntime.Must(operatorapi.AddToScheme(scheme))
43-
}
44-
4533
const (
46-
EnvUserName = "USERNAME"
47-
EnvPassword = "PASSWORD"
48-
EnvRestAddr = "REST_API_IP"
34+
EnvNamespaceName = "WATCH_NAMESPACE"
4935
)
5036

51-
func getRestConfigFromEnv() (*rest.Config, error) {
52-
envVars := map[string]string{
53-
EnvUserName: "",
54-
EnvPassword: "",
55-
EnvRestAddr: "",
56-
}
57-
58-
for k := range envVars {
59-
if value, ok := os.LookupEnv(k); ok {
60-
envVars[k] = value
61-
} else {
62-
return nil, fmt.Errorf("Required env variable: '%s' isn't found", k)
63-
}
64-
}
65-
66-
restConfig := &rest.Config{
67-
Host: envVars[EnvRestAddr],
68-
Username: envVars[EnvUserName],
69-
Password: envVars[EnvPassword],
70-
}
71-
72-
return restConfig, nil
37+
func init() {
38+
utilruntime.Must(clientgoscheme.AddToScheme(clientmanagers.Scheme))
39+
utilruntime.Must(operatorapi.AddToScheme(clientmanagers.Scheme))
7340
}
7441

7542
func main() {
76-
klog.InitFlags(nil)
43+
log.InitFlags(nil)
7744

78-
scPoolMap, err := operutil.GetPoolConfigmapContent()
45+
namespace, err := getOperatorNamespace()
7946
if err != nil {
80-
klog.Errorf("Read pool configmap failed, error: %s", err)
81-
panic(err)
82-
} else {
83-
klog.Infof("Read pool configmap %v", scPoolMap)
84-
}
85-
86-
var valid bool
87-
mgr, err := drivermanager.NewManager(scheme, scPoolMap.ScPool)
88-
if err != nil {
89-
klog.Errorf("Initialize mamager failed, error: %s", err)
90-
panic(err)
91-
}
92-
93-
restConfig, err := getRestConfigFromEnv()
94-
if err != nil {
95-
klog.Error(err)
96-
panic(err)
97-
}
98-
99-
restClient, err := rest.NewFSRestClient(restConfig)
100-
if err != nil {
101-
// Update condition
102-
var _ = mgr.UpdateCondition(operatorapi.ExporterReady, false, drivermanager.AuthFailure, drivermanager.AuthFailureMessage)
103-
klog.Errorf("Fail to initialize rest client, error: %s", err)
104-
goto error_out
47+
os.Exit(1)
10548
}
10649

107-
valid, err = restClient.CheckVersion()
108-
if err != nil {
109-
klog.Errorf("Flash system version check hit error: %s", err)
110-
// Update condition
111-
var _ = mgr.UpdateCondition(operatorapi.ExporterReady, false, drivermanager.RestFailure, drivermanager.RestErrorMessage)
112-
goto error_out
113-
} else if !valid {
114-
klog.Error("Flash system version invalid")
115-
var _ = mgr.UpdateCondition(operatorapi.ExporterReady, false, drivermanager.VersionCheckFailed, drivermanager.VersionCheckErrMessage)
116-
goto error_out
117-
}
118-
119-
// Print the user role in log.
120-
valid, err = restClient.CheckUserRole()
121-
if err != nil {
122-
klog.Errorf("Flash system user role check hit errors: %s", err)
123-
// Update condition
124-
var _ = mgr.UpdateCondition(operatorapi.ExporterReady, false, drivermanager.RestFailure, drivermanager.RestErrorMessage)
125-
goto error_out
126-
} else if !valid {
127-
klog.Error("Flash system user role invalid")
128-
// Update condition
129-
var _ = mgr.UpdateCondition(operatorapi.ExporterReady, false, drivermanager.RoleCheckFailed, drivermanager.RoleCheckErrMessage)
130-
goto error_out
131-
}
132-
133-
// ready, err = restClient.CheckFlashsystemClusterState()
134-
// if err != nil {
135-
// klog.Errorf("Flash system cluster state check hit errors: %s", err)
136-
// // Update condition
137-
// var _ = mgr.UpdateCondition(operatorapi.ExporterReady, false, drivermanager.RestFailure, drivermanager.RestErrorMessage)
138-
// goto error_out
139-
// } else if !ready {
140-
// klog.Error("Flash system cluster is not online")
141-
// // Update condition
142-
// var _ = mgr.UpdateCondition(operatorapi.ExporterReady, false, drivermanager.ClusterNotOnline, drivermanager.ClusterErrMessage)
143-
// goto error_out
144-
// } else {
145-
// klog.Info("Flash system cluster ready")
146-
// }
147-
148-
// Update ready condition
149-
{
150-
var _ = mgr.UpdateCondition(operatorapi.ExporterReady, true, "", "")
151-
var _ = mgr.UpdateCondition(operatorapi.StorageClusterReady, true, "", "")
152-
klog.Info("Exporter check done, ready to serve")
50+
systems, err := clientmanagers.GetManagers(namespace, make(map[string]*rest.FSRestClient))
51+
if err != nil || len(systems) == 0 {
52+
log.Error("Could not create managers")
53+
os.Exit(1)
15354
}
15455

15556
// TODO: handle pod terminating signal
156-
go prome.RunExporter(restClient, mgr.GetSubsystemName(), mgr.GetNamespaceName())
57+
go prome.RunExporter(systems, namespace)
58+
waitForSignal()
15759

158-
error_out:
60+
}
61+
62+
func waitForSignal() {
15963
sigs := make(chan os.Signal, 1)
16064
done := make(chan bool, 1)
16165
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
162-
klog.Info("Awaiting signal to exit")
66+
log.Info("Awaiting signal to exit")
16367
go func() {
16468
sig := <-sigs
165-
klog.Infof("Received signal: %+v, clean up...", sig)
69+
log.Infof("Received signal: %+v, clean up...", sig)
16670
done <- true
16771
}()
16872

16973
// exiting
17074
<-done
171-
klog.Info("Exiting")
75+
log.Info("Exiting")
76+
}
77+
78+
func getOperatorNamespace() (string, error) {
79+
if value, ok := os.LookupEnv(EnvNamespaceName); ok {
80+
return value, nil
81+
} else {
82+
return "", fmt.Errorf("required env variable: '%s' isn't found", EnvNamespaceName)
83+
}
17284
}

docs/configuring/configuring.dita

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE reference PUBLIC "-//IBM//DTD DITA IBM Reference//EN" "ibm-reference.dtd">
3+
<reference id="configuring" xml:lang="en-us">
4+
<title>Configuring</title>
5+
<titlealts>
6+
<navtitle>Configuring</navtitle>
7+
<searchtitle>Configuring</searchtitle>
8+
</titlealts>
9+
<shortdesc><tm trademark="Red Hat" tmtype="reg">Red Hat</tm>
10+
<tm trademark="OpenShift" tmtype="reg">OpenShift</tm> Data Foundation (ODF) uses the <ph
11+
translate="no">ODF FlashSystem driver</ph> to integrate with your <tm trademark="IBM FlashSystem"
12+
tmtype="reg">IBM FlashSystem</tm> storage system. When using the <tm trademark="OpenShift"
13+
tmtype="reg">OpenShift</tm> Data Foundation with your storage system ensure that all configuration
14+
needs are met by following the <tm trademark="Red Hat" tmtype="reg">Red Hat</tm> ODF documentation
15+
set.</shortdesc>
16+
<refbody>
17+
<section>
18+
<p>The <ph translate="no">ODF FlashSystem driver</ph> enable IBM Spectrum Virtualize family products
19+
to be used with <tm trademark="Red Hat" tmtype="reg">Red Hat</tm>
20+
<tm trademark="OpenShift" tmtype="reg">OpenShift</tm> Data Foundation.</p>
21+
<p>For more information and documentation, see the following:<ul>
22+
<li>Support summary for enabled IBM Spectrum Virtualize family products and <tm trademark="Red Hat"
23+
tmtype="reg">Red Hat</tm>
24+
<tm trademark="OpenShift" tmtype="reg">OpenShift</tm> Data Foundation: <xref
25+
href="../landing/odf_flashsystem_driver_support_matrix.html" scope="peer" format="html">ODF
26+
FlashSystem driver support summary</xref>.</li>
27+
<li>User information and release notes documentation for the <tm trademark="Red Hat" tmtype="reg"
28+
>Red Hat</tm>
29+
<tm trademark="OpenShift" tmtype="reg">OpenShift</tm> Data Foundation: <xref
30+
href="https://access.redhat.com/documentation/en-us/red_hat_openshift_data_foundation" format="html"
31+
scope="external"><tm trademark="OpenShift" tmtype="reg">OpenShift</tm> Data Foundation
32+
documentation</xref>.</li>
33+
<li>General information about the <tm trademark="OpenShift" tmtype="reg">OpenShift</tm> Data
34+
Foundation, a software-defined storage for containers: <xref
35+
href="https://www.redhat.com/en/technologies/cloud-computing/openshift-data-foundation"
36+
format="html" scope="external"><tm trademark="OpenShift" tmtype="reg">OpenShift</tm> Data
37+
Foundation</xref>.</li>
38+
</ul></p>
39+
</section>
40+
<section id="odf_config">
41+
<title>Configuration considerations</title>
42+
<p>When creating block storage persistent volumes, be sure to select the storage class
43+
<cmdname>&lt;storage_class_name&gt;</cmdname> for best performance. The storage class allows a
44+
direct I/O path to the FlashSystem storage system.</p>
45+
</section>
46+
</refbody>
47+
</reference><?tm 1639394264348 22 Red Hat||OpenShift||IBM FlashSystem||IBM||Ceph ?>

docs/configuring/limitations.dita

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE reference PUBLIC "-//IBM//DTD DITA IBM Reference//EN" "ibm-reference.dtd">
3+
<reference id="svc_odf_config" xml:lang="en-us" otherprops="50845">
4+
<title>Limitations</title>
5+
<titlealts>
6+
<navtitle>Limitations</navtitle>
7+
<searchtitle>Limitations</searchtitle>
8+
</titlealts>
9+
<shortdesc>Refer to these limitations before working with the <ph translate="no">ODF FlashSystem
10+
driver</ph>.</shortdesc>
11+
<refbody>
12+
<section id="limitations">The <ph translate="no">ODF FlashSystem driver</ph> contains the following limitations:<ul>
13+
<li>Only x86 architecture is supported.</li>
14+
<li>When creating a storage class from within the <tm trademark="Red Hat" tmtype="reg">Red Hat</tm>
15+
ODF user-interface, installation of <tm trademark="Ceph" tmtype="reg">Ceph</tm> RWO on FlashSystem
16+
storage systems is allowed. When working with FlashSystem storage systems, it is best to use a
17+
direct I/O path to the storage system. For more information, see <xref
18+
href="configuring.dita#configuring/odf_config"/>.</li>
19+
<li>The following individual reports are not currently generated:<ul>
20+
<li>Pool performance</li>
21+
<li>Volume performance</li>
22+
<li>Volume storage class capacity</li>
23+
</ul></li>
24+
<li>Reports are not generated for FlashSystem information and events.</li>
25+
</ul></section>
26+
</refbody>
27+
</reference><?tm 1639394264348 22 Red Hat||OpenShift||IBM FlashSystem||IBM||Ceph ?>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE topic PUBLIC "-//OASIS//DTD DITA Topic//EN" "topic.dtd">
3+
<topic id="welcome" outputclass="kc_welcome" xml:lang="en-us">
4+
<title>ODF FlashSystem driver welcome</title>
5+
<prolog>
6+
<copyright>
7+
<copyryear year="2022"/>
8+
<copyrholder/><!--Add copyright year or years as the "year" attribute for copyryear. Copyright holder information is filled in automatically
9+
for IBM. Critdates are not currently used by the transform, but they are preserved in the metadata. -->
10+
</copyright>
11+
</prolog>
12+
</topic>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE concept PUBLIC "-//IBM//DTD DITA IBM Concept//EN" "ibm-concept.dtd">
3+
<?Pub Inc?><concept id="docs_whatsnew" xml:lang="en-us">
4+
<title>What's new</title>
5+
<shortdesc>This topic lists the dates and nature of updates to the published information of the <ph
6+
translate="no">ODF FlashSystem driver</ph>.</shortdesc>
7+
<conbody>
8+
<table>
9+
<tgroup cols="2">
10+
<colspec colname="col1" colwidth="29*" />
11+
<colspec colname="col2" colwidth="70*" />
12+
<thead>
13+
<row outputclass="xlight" valign="bottom">
14+
<entry align="left" colname="col1">Date</entry>
15+
<entry align="left" colname="col2">Nature of updates to the published information</entry>
16+
</row>
17+
</thead>
18+
<tbody>
19+
<row>
20+
<entry colname="col1">31 January 2023</entry>
21+
<entry colname="col2">
22+
<p>The version information was added in IBM Documentation as part of the initial <ph translate="no"
23+
>ODF FlashSystem driver</ph> 1.3.0 release.</p>
24+
<p><ph translate="no">ODF FlashSystem driver</ph> adds new support for the following:<ul>
25+
<li>Multiple FlashSystem storage systems, including health, capacity, and performance
26+
information.</li>
27+
<li>Storage calculations for FlashSystem child pools.</li>
28+
<li>External storage system calculations.</li>
29+
</ul></p>
30+
</entry>
31+
</row>
32+
</tbody>
33+
</tgroup>
34+
</table>
35+
</conbody>
36+
37+
</concept><?Pub *0000001199?><?tm 1670402701300 1 IBM ?>

0 commit comments

Comments
 (0)