admin-cli/cmd/backup_restore.go (98 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package cmd
import (
"fmt"
"github.com/apache/incubator-pegasus/admin-cli/executor"
"github.com/apache/incubator-pegasus/admin-cli/shell"
"github.com/desertbit/grumble"
)
func init() {
shell.AddCommand(&grumble.Command{
Name: "backup",
Help: "backup a table",
Usage: "backup <TABLE_ID> <PROVIDER_TYPE> [SPECIFIC_BACKUP_PATH]",
Args: func(a *grumble.Args) {
a.Int("tableID", "the table ID")
a.String("providerType", "the provider type of backup")
a.String("backupPath", "the user specified backup path", grumble.Default(""))
},
Run: func(c *grumble.Context) error {
tableID := c.Args.Int("tableID")
providerType := c.Args.String("providerType")
backupPath := c.Args.String("backupPath")
return executor.BackupTable(pegasusClient, tableID, providerType, backupPath)
},
})
shell.AddCommand(&grumble.Command{
Name: "query-backup-status",
Help: "query backup status",
Usage: "query-backup-status <TABLE_ID> [BACKUP_ID]",
Args: func(a *grumble.Args) {
a.Int("tableID", "the table ID")
a.Int64("backupID", "the backup ID", grumble.Default(int64(0)))
},
Run: func(c *grumble.Context) error {
tableID := c.Args.Int("tableID")
backupID := c.Args.Int64("backupID")
return executor.QueryBackupStatus(pegasusClient, tableID, backupID)
},
})
shell.AddCommand(&grumble.Command{
Name: "restore",
Help: "restore a table",
Usage: `restore
<-c|--oldClusterName OLD_CLUSTER_NAME>
<-a|--oldTableName OLD_TABLE_NAME>
<-i|--oldTableID OLD_TABLE_ID>
<-t|--timestamp TIMESTAMP/BACKUP_ID>
<-b|--providerType PROVIDER_TYPE>
[-n|--newTableName NEW_TABLE_NAME]
[-r|--restorePath SPECIFIC_RESTORE_PATH]
[-s|--skipBadPartition SKIP_BAD_PARTITION]
[-p|--policyName POLICY_NAME]`,
Run: func(c *grumble.Context) error {
if c.Flags.String("oldClusterName") == "" {
return fmt.Errorf("oldClusterName cannot be empty")
}
if c.Flags.String("oldTableName") == "" {
return fmt.Errorf("oldTableName cannot be empty")
}
if c.Flags.Int("oldTableID") == 0 {
return fmt.Errorf("oldTableID cannot be empty")
}
if c.Flags.Int64("timestamp") == 0 {
return fmt.Errorf("timestamp cannot be empty")
}
if c.Flags.String("providerType") == "" {
return fmt.Errorf("providerType cannot be empty")
}
var newName string
if c.Flags.String("newTableName") == "" {
newName = c.Flags.String("oldTableName")
} else {
newName = c.Flags.String("newTableName")
}
oldClusterName := c.Flags.String("oldClusterName")
oldTableName := c.Flags.String("oldTableName")
oldTableID := c.Flags.Int("oldTableID")
backupID := c.Flags.Int64("timestamp")
providerType := c.Flags.String("providerType")
newTableName := newName
restorePath := c.Flags.String("restorePath")
skipBadPartition := c.Flags.Bool("skipBadPartition")
policyName := c.Flags.String("policyName")
return executor.RestoreTable(pegasusClient, oldClusterName, oldTableName,
oldTableID, backupID, providerType, newTableName, restorePath, skipBadPartition, policyName)
},
Flags: func(f *grumble.Flags) {
/*define the flags*/
f.String("c", "oldClusterName", "", "old_cluster_name, for example, onebox")
f.String("a", "oldTableName", "", "old_app_name, for example, temp")
f.Int("i", "oldTableID", 0, "old_app_id, for example, 1")
f.Int64("t", "timestamp", 0, "timestamp or backup_id")
f.String("b", "providerType", "", "backup_provider_type, for example, hdfs_zjy")
f.String("n", "newTableName", "", "new_app_name")
f.String("r", "restorePath", "", "restore_path")
f.Bool("s", "skipBadPartition", false, "whether to skip bad partition when create new table")
f.String("p", "policyName", "", "old_policy_name, only worked for restoring app created before Pegasus2.2.0")
},
})
}