Commit 0584c7e7 authored by 黎博's avatar 黎博

Merge branch 'master' into ldap

parents aa5d6cc8 2ca6b89b
...@@ -148,6 +148,14 @@ ...@@ -148,6 +148,14 @@
<version>4.1.1</version> <version>4.1.1</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/io.fabric8/kubernetes-client -->
<dependency>
<groupId>io.fabric8</groupId>
<artifactId>kubernetes-client</artifactId>
<version>5.4.1</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
package cn.qg.holmes.controller.effect;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.service.effect.DatabaseSyncService;
import cn.qg.holmes.utils.K8sService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@Slf4j
@CrossOrigin
@RestController
@RequestMapping("/dbsync")
public class DbSyncController {
@Autowired
DatabaseSyncService databaseSyncService;
@Value("${dbsync.mysql.ip}")
private String ip;
@Value("${dbsync.mysql.port}")
private String port;
@Value("${dbsync.mysql.username}")
private String username;
@Value("${dbsync.mysql.password}")
private String password;
@GetMapping("/one")
public JsonResult syncSingleTable(@RequestParam String namespace, @RequestParam String dbName, @RequestParam String tableName) {
try {
long startTime = System.currentTimeMillis();
Map<String, String> map = databaseSyncService.getMysqlInfoByNamespace(namespace);
String destIp = map.get("ip");
String destPort = map.get("port");
log.info("获取到{}环境的Mysql地址为:{}", namespace, destIp + ":" + destPort);
if (tableName.equalsIgnoreCase("all") || tableName.equals("")) {
log.info("开始同步{}库下所有的表", dbName);
databaseSyncService.getDbInfoFromSource(ip, port, username, password, dbName);
databaseSyncService.syncDbToDest(destIp, destPort, "qa", "qatest", dbName, namespace);
} else {
log.info("开始同步{}库下{}表", dbName, tableName);
databaseSyncService.getSingleTableFromSource(ip, port, username, password, dbName, tableName);
databaseSyncService.syncSingleTableToDest(destIp, destPort, "qa", "qatest", dbName, tableName);
}
long endTime = System.currentTimeMillis();
long elapsedTime = (endTime - startTime) / 1000;
return JsonResult.buildSuccessResult(elapsedTime + "s");
} catch (Exception e) {
e.printStackTrace();
return JsonResult.buildErrorStateResult("同步失败!", false);
}
}
/**
* 获取数据库列表
* @return
*/
@GetMapping("/dbs")
public JsonResult getDatabaseList() {
return JsonResult.buildSuccessResult(databaseSyncService.getDatabaseList(ip, port, username, password));
}
/**
* 获取某个库下的表列表
* @param dbName 数据库名
* @return
*/
@GetMapping("/tables")
public JsonResult getTableList(@RequestParam String dbName) {
List<Object> tableList = databaseSyncService.getTableListByDb(ip, port, username, password, dbName);
tableList.add(0, "all");
return JsonResult.buildSuccessResult(tableList);
}
}
package cn.qg.holmes.service.effect;
import java.util.List;
import java.util.Map;
public interface DatabaseSyncService {
boolean getDbInfoFromSource(String ip, String port, String username, String password, String dbName);
boolean syncDbToDest(String ip, String port, String username, String password, String dbName, String namespace);
boolean getSingleTableFromSource(String ip, String port, String username, String password, String dbName, String tableName);
boolean syncSingleTableToDest(String ip, String port, String username, String password, String dbName, String tableName);
List<Object> getDatabaseList(String ip, String port, String username, String password);
Map<String, String> getMysqlInfoByNamespace(String namespace);
List<Object> getTableListByDb(String ip, String port, String username, String password, String dbName);
}
\ No newline at end of file
package cn.qg.holmes.utils;
import io.fabric8.kubernetes.api.model.Namespace;
import io.fabric8.kubernetes.client.Config;
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
//@Component
public class K8sService {
private KubernetesClient kubernetesClient;
public K8sService() {
try {
String configYAML = String.join("\n", readConfigFile("kube-config.yml"));
Config config = Config.fromKubeconfig(configYAML);
kubernetesClient = new DefaultKubernetesClient(config);
String configCrt = String.join("\n", readConfigFile("tke-cluster-ca.crt"));
config.setCaCertData(configCrt);
} catch (Exception e) {
log.info("k8s service 初始化失败!");
e.printStackTrace();
}
}
/**
* 读取k8s配置文件
* @param file 配置文件名
* @return
* @throws IOException
*/
public static List<String> readConfigFile(String file) throws IOException {
String str = "";
ClassPathResource resource = new ClassPathResource(file);
InputStream in = resource.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
List<String> result = new ArrayList<>();
while ((str = br.readLine()) != null) {
result.add(str);
}
return result;
}
/**
* 获取namespace列表
* @return
*/
public List<Map<String, Object>> getNamespaceList() {
List<Map<String, Object>> resultList = new ArrayList<>();
List<Namespace> namespaceList = kubernetesClient.namespaces().list().getItems();
for (Namespace namespace: namespaceList) {
log.info(namespace.toString());
if (namespace.getMetadata().getAnnotations() != null) {
Map<String, Object> map = new HashMap<>();
map.put("name", namespace.getMetadata().getName());
map.put("description", namespace.getMetadata().getAnnotations().get("description"));
map.put("owner", namespace.getMetadata().getAnnotations().get("owner"));
map.put("status", namespace.getStatus().getPhase());
map.put("createdAt",namespace.getMetadata().getCreationTimestamp());
resultList.add(map);
}
}
return resultList;
}
}
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURaRENDQWt5Z0F3SUJBZ0lJQWlFbzhnb1ZhZVl3RFFZSktvWklodmNOQVFFTEJRQXdVREVMTUFrR0ExVUUKQmhNQ1EwNHhLakFSQmdOVkJBb1RDblJsYm1ObGJuUjVkVzR3RlFZRFZRUUtFdzV6ZVhOMFpXMDZiV0Z6ZEdWeQpjekVWTUJNR0ExVUVBeE1NWTJ4ekxXRmpabmcwY0hacU1CNFhEVEU1TURFd016QXpNRFExTWxvWERUTTVNREV3Ck16QXpNRFExTWxvd1VERUxNQWtHQTFVRUJoTUNRMDR4S2pBUkJnTlZCQW9UQ25SbGJtTmxiblI1ZFc0d0ZRWUQKVlFRS0V3NXplWE4wWlcwNmJXRnpkR1Z5Y3pFVk1CTUdBMVVFQXhNTVkyeHpMV0ZqWm5nMGNIWnFNSUlCSWpBTgpCZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUE1UnVyS0hSMG5GMlAyNndlU01haittbXltdytsCkEvODFyNUl3QVFZaXoxSDRRT3IrVFdiZjd0Z2JsWXNOemJpSk5qTk56VkRiQ2RidkhZaHhLNlVjemJDOGJocXEKakE4Y29tcCtkbENlNm13VEJKNzRwM08rSlduNFJOY0QreHJ4dXJ6aE9GRFZra1RrRWNqMDZXT25oMk9Dc0VaQwpCeVczWlBYQ2p1ZG8wNUprTUhXaEUvcERmSWEyYWIxNmRZeGZ2SWhzdjhYcWdRMm92T0RvOEg5aVBmWkMvVkl4CmpoUWtPem1SbmRlRXgvWlpiWTlvMW9PbWwxcjl3ZnRXWklzWTJYbTY0SzRrVDg3YWZURi9xaXZ4OEdXOXBwRHkKb3JZVlhnVVFKVkRHMmIyWXdGYldYdlB3SzZZYlNVOUdydUplUnFmdklLaSt3S3RxQzBMZ1pZckxVd0lEQVFBQgpvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBb1F3SFFZRFZSMGxCQll3RkFZSUt3WUJCUVVIQXdJR0NDc0dBUVVGCkJ3TUJNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBRi9jYzF0RGZUSFEKeDVyRmpyUEt5YW5xOWJWb2YySlorMnhiaHp1b2sxU2ljYlNwdExia0h4VDh6cmlVeHNQM3djbFluSVFtN25XNgo5VEl6S1hJOUgra3ZFbDNQQXZyU1VVRnFOSytLWlBEZFpQdnNvcFZ1dDNtc3ZQeWRnNGRlODgzd0EwSmQ1dWl1CjNKV0xBYm1hekhZT01taEQyRW9yc1VpWTZ3NXVJNy9rMld6bUgzelVGd250WDRNMjFYR3JrZm5IUUVhVHQvaHQKR3JsUWpQVzgwNzFwSm9UaVgxNURzd2VNTS9KZEtMV3FTaHVJdWY3YXNqcFUrSWRtQjU3U0g3NER0eTNEaTU4QwpHVldBQjEzc3BtZGpIbGhDeTlRZGxpQzhkUzVGai80SFRIdDJHYTBDREZLRVk0TnF3SGUvK0hqNmRWOTJrcmJHCmdaNkZRa2FId1ZrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
server: https://cls-acfx4pvj.ccs.tencent-cloud.com
name: local
contexts:
- context:
cluster: local
user: admin
name: cls-acfx4pvj-context-default
current-context: cls-acfx4pvj-context-default
kind: Config
preferences: {}
users:
- name: admin
user:
token: BIsuBv18csrBHVXClYZ4ln3izUYJt9Xa
\ No newline at end of file
-----BEGIN CERTIFICATE-----
MIIDZDCCAkygAwIBAgIIAiEo8goVaeYwDQYJKoZIhvcNAQELBQAwUDELMAkGA1UE
BhMCQ04xKjARBgNVBAoTCnRlbmNlbnR5dW4wFQYDVQQKEw5zeXN0ZW06bWFzdGVy
czEVMBMGA1UEAxMMY2xzLWFjZng0cHZqMB4XDTE5MDEwMzAzMDQ1MloXDTM5MDEw
MzAzMDQ1MlowUDELMAkGA1UEBhMCQ04xKjARBgNVBAoTCnRlbmNlbnR5dW4wFQYD
VQQKEw5zeXN0ZW06bWFzdGVyczEVMBMGA1UEAxMMY2xzLWFjZng0cHZqMIIBIjAN
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5RurKHR0nF2P26weSMaj+mmymw+l
A/81r5IwAQYiz1H4QOr+TWbf7tgblYsNzbiJNjNNzVDbCdbvHYhxK6UczbC8bhqq
jA8comp+dlCe6mwTBJ74p3O+JWn4RNcD+xrxurzhOFDVkkTkEcj06WOnh2OCsEZC
ByW3ZPXCjudo05JkMHWhE/pDfIa2ab16dYxfvIhsv8XqgQ2ovODo8H9iPfZC/VIx
jhQkOzmRndeEx/ZZbY9o1oOml1r9wftWZIsY2Xm64K4kT87afTF/qivx8GW9ppDy
orYVXgUQJVDG2b2YwFbWXvPwK6YbSU9GruJeRqfvIKi+wKtqC0LgZYrLUwIDAQAB
o0IwQDAOBgNVHQ8BAf8EBAMCAoQwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF
BwMBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAF/cc1tDfTHQ
x5rFjrPKyanq9bVof2JZ+2xbhzuok1SicbSptLbkHxT8zriUxsP3wclYnIQm7nW6
9TIzKXI9H+kvEl3PAvrSUUFqNK+KZPDdZPvsopVut3msvPydg4de883wA0Jd5uiu
3JWLAbmazHYOMmhD2EorsUiY6w5uI7/k2WzmH3zUFwntX4M21XGrkfnHQEaTt/ht
GrlQjPW8071pJoTiX15DsweMM/JdKLWqShuIuf7asjpU+IdmB57SH74Dty3Di58C
GVWAB13spmdjHlhCy9QdliC8dS5Fj/4HTHt2Ga0CDFKEY4NqwHe/+Hj6dV92krbG
gZ6FQkaHwVk=
-----END CERTIFICATE-----
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment