Move tier status logic to backend (#2418)

This commit is contained in:
jinapurapu
2022-10-31 12:25:59 -07:00
committed by GitHub
parent a2745c687e
commit 0ae1ace8fe
5 changed files with 43 additions and 44 deletions

View File

@@ -49,6 +49,9 @@ type Tier struct {
// s3
S3 *TierS3 `json:"s3,omitempty"`
// status
Status bool `json:"status,omitempty"`
// type
// Enum: [s3 gcs azure minio unsupported]
Type string `json:"type,omitempty"`

View File

@@ -106,7 +106,6 @@ const ListTiersConfiguration = ({ classes }: IListTiersConfig) => {
const [records, setRecords] = useState<ITierElement[]>([]);
const [filter, setFilter] = useState<string>("");
const [isLoading, setIsLoading] = useState<boolean>(true);
const [checkTierStatus, setcheckTierStatus] = useState<boolean>(false);
const [updateCredentialsOpen, setUpdateCredentialsOpen] =
useState<boolean>(false);
const [selectedTier, setSelectedTier] = useState<ITierElement>({
@@ -117,46 +116,6 @@ const ListTiersConfiguration = ({ classes }: IListTiersConfig) => {
IAM_SCOPES.ADMIN_SET_TIER,
]);
useEffect(() => {
if (checkTierStatus) {
records.forEach((tier: ITierElement) => {
var endpoint: string;
switch (tier.type) {
case "minio":
endpoint = tier.minio?.endpoint + "/" + tier.minio?.bucket || "";
break;
case "s3":
endpoint = tier.s3?.endpoint + "/" + tier.s3?.bucket || "";
break;
case "gcs":
endpoint = tier.gcs?.endpoint + "/" + tier.gcs?.bucket || "";
break;
case "azure":
endpoint = tier.azure?.endpoint + "/" + tier.azure?.bucket || "";
break;
default:
endpoint = "";
}
const xhr = new XMLHttpRequest();
xhr.open("HEAD", endpoint);
xhr.send();
xhr.onreadystatechange = () => {
if (xhr.readyState === 4 || xhr.readyState === 2) {
tier.status = true;
} else {
tier.status = false;
}
};
xhr.onerror = () => {
tier.status = false;
};
});
setRecords(records);
setcheckTierStatus(false);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [checkTierStatus]);
useEffect(() => {
if (isLoading) {
if (distributedSetup) {
@@ -166,7 +125,6 @@ const ListTiersConfiguration = ({ classes }: IListTiersConfig) => {
.then((res: ITierResponse) => {
setRecords(res.items || []);
setIsLoading(false);
setcheckTierStatus(true);
})
.catch((err: ErrorResponseHandler) => {
dispatch(setErrorSnackMessage(err));

View File

@@ -19,7 +19,10 @@ package restapi
import (
"context"
"encoding/base64"
"log"
"regexp"
"strconv"
"strings"
"github.com/dustin/go-humanize"
"github.com/go-openapi/runtime/middleware"
@@ -27,6 +30,9 @@ import (
"github.com/minio/console/restapi/operations"
tieringApi "github.com/minio/console/restapi/operations/tiering"
"github.com/minio/madmin-go"
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
)
func registerAdminTiersHandlers(api *operations.ConsoleAPI) {
@@ -109,6 +115,7 @@ func getTiers(ctx context.Context, client MinioAdmin) (*models.TierListResponse,
Objects: strconv.Itoa(stats.NumObjects),
Versions: strconv.Itoa(stats.NumVersions),
},
Status: false,
})
case madmin.MinIO:
tiersList = append(tiersList, &models.Tier{
@@ -125,6 +132,7 @@ func getTiers(ctx context.Context, client MinioAdmin) (*models.TierListResponse,
Objects: strconv.Itoa(stats.NumObjects),
Versions: strconv.Itoa(stats.NumVersions),
},
Status: checkTierStatus(tierData.MinIO.Endpoint, tierData.MinIO.AccessKey, tierData.MinIO.SecretKey, tierData.MinIO.Bucket),
})
case madmin.GCS:
tiersList = append(tiersList, &models.Tier{
@@ -140,6 +148,7 @@ func getTiers(ctx context.Context, client MinioAdmin) (*models.TierListResponse,
Objects: strconv.Itoa(stats.NumObjects),
Versions: strconv.Itoa(stats.NumVersions),
},
Status: false,
})
case madmin.Azure:
tiersList = append(tiersList, &models.Tier{
@@ -156,15 +165,16 @@ func getTiers(ctx context.Context, client MinioAdmin) (*models.TierListResponse,
Objects: strconv.Itoa(stats.NumObjects),
Versions: strconv.Itoa(stats.NumVersions),
},
Status: false,
})
case madmin.Unsupported:
tiersList = append(tiersList, &models.Tier{
Type: models.TierTypeUnsupported,
Type: models.TierTypeUnsupported,
Status: false,
})
}
}
// build response
return &models.TierListResponse{
Items: tiersList,
@@ -407,3 +417,23 @@ func getEditTierCredentialsResponse(session *models.Principal, params tieringApi
}
return nil
}
func checkTierStatus(endpoint string, accessKey string, secretKey string, bucketName string) bool {
// Initialize minio client object.
re := regexp.MustCompile(`(^\w+:|^)\/\/`)
s := re.ReplaceAllString(endpoint, "")
minioClient, err := minio.New(s, &minio.Options{
Creds: credentials.NewStaticV4(accessKey, secretKey, ""),
Secure: false,
})
if err != nil {
log.Println(err)
return false
}
bucketTest, err := minioClient.BucketExists(context.Background(), bucketName)
if err != nil {
log.Println(err)
return strings.Contains(err.Error(), "The request signature we calculated does not match the signature you provided. Check your key and signing method.")
}
return bucketTest
}

View File

@@ -7681,6 +7681,9 @@ func init() {
"type": "object",
"$ref": "#/definitions/tier_s3"
},
"status": {
"type": "boolean"
},
"type": {
"type": "string",
"enum": [
@@ -15942,6 +15945,9 @@ func init() {
"type": "object",
"$ref": "#/definitions/tier_s3"
},
"status": {
"type": "boolean"
},
"type": {
"type": "string",
"enum": [

View File

@@ -5119,6 +5119,8 @@ definitions:
tier:
type: object
properties:
status:
type: boolean
type:
type: string
enum: