chore: Adapt MetricsRepository to new ProvidersControllers model

pull/213/head
NaiJi ✨ 2023-02-28 07:00:52 +04:00
parent 62c0030f8e
commit 97e9e9d9cb
6 changed files with 36 additions and 117 deletions

View File

@ -1,23 +1,16 @@
import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:selfprivacy/config/get_it_config.dart'; import 'package:selfprivacy/config/get_it_config.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/volume_provider.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/volume_provider.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider.dart';
import 'package:selfprivacy/logic/api_maps/staging_options.dart'; import 'package:selfprivacy/logic/api_maps/staging_options.dart';
import 'package:selfprivacy/logic/models/disk_size.dart'; import 'package:selfprivacy/logic/models/disk_size.dart';
import 'package:selfprivacy/logic/models/hive/server_domain.dart';
import 'package:selfprivacy/logic/models/json/hetzner_server_info.dart'; import 'package:selfprivacy/logic/models/json/hetzner_server_info.dart';
import 'package:selfprivacy/logic/models/hive/server_details.dart'; import 'package:selfprivacy/logic/models/hive/server_details.dart';
import 'package:selfprivacy/logic/models/hive/user.dart'; import 'package:selfprivacy/logic/models/hive/user.dart';
import 'package:selfprivacy/logic/models/metrics.dart';
import 'package:selfprivacy/logic/models/price.dart'; import 'package:selfprivacy/logic/models/price.dart';
import 'package:selfprivacy/logic/models/server_basic_info.dart';
import 'package:selfprivacy/logic/models/server_metadata.dart';
import 'package:selfprivacy/logic/models/server_provider_location.dart'; import 'package:selfprivacy/logic/models/server_provider_location.dart';
import 'package:selfprivacy/utils/extensions/string_extensions.dart';
import 'package:selfprivacy/utils/network_utils.dart'; import 'package:selfprivacy/utils/network_utils.dart';
import 'package:selfprivacy/utils/password_generator.dart'; import 'package:selfprivacy/utils/password_generator.dart';
@ -353,10 +346,10 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi {
required final String serverType, required final String serverType,
}) async { }) async {
final String stagingAcme = StagingOptions.stagingAcme ? 'true' : 'false'; final String stagingAcme = StagingOptions.stagingAcme ? 'true' : 'false';
Response? serverCreateResponse; Response? serverCreateResponse;
DioError? hetznerError; DioError? hetznerError;
bool success = false; bool success = false;
final Dio client = await getClient(); final Dio client = await getClient();
try { try {
final Map<String, Object> data = { final Map<String, Object> data = {
@ -405,94 +398,6 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi {
); );
} }
Future<GenericResult<ServerHostingDetails?>> skldfjalkdsjflkasd({
required final String dnsApiToken,
required final User rootUser,
required final String domainName,
required final ServerVolume volume,
required final String serverType,
required final DnsProviderType dnsProvider,
}) async {
final String dbPassword = StringGenerators.dbPassword();
final int volumeId = volume.id;
final String apiToken = StringGenerators.apiToken();
final String hostname = getHostnameFromDomain(domainName);
const String infectBranch = 'providers/hetzner';
final String stagingAcme = StagingOptions.stagingAcme ? 'true' : 'false';
final String base64Password =
base64.encode(utf8.encode(rootUser.password ?? 'PASS'));
final String dnsProviderType = dnsProviderToInfectName(dnsProvider);
Response? serverCreateResponse;
ServerHostingDetails? serverDetails;
DioError? hetznerError;
bool success = false;
final Dio client = await getClient();
try {
final Map<String, Object> data = {
'name': hostname,
'server_type': serverType,
'start_after_create': false,
'image': 'ubuntu-20.04',
'volumes': [volumeId],
'networks': [],
'user_data': '#cloud-config\n'
'runcmd:\n'
'- curl https://git.selfprivacy.org/SelfPrivacy/selfprivacy-nixos-infect/raw/branch/$infectBranch/nixos-infect | '
"STAGING_ACME='$stagingAcme' PROVIDER=$infectProviderName DNS_PROVIDER_TYPE=$dnsProviderType "
"NIX_CHANNEL=nixos-21.05 DOMAIN='$domainName' LUSER='${rootUser.login}' ENCODED_PASSWORD='$base64Password' "
'CF_TOKEN=$dnsApiToken DB_PASSWORD=$dbPassword API_TOKEN=$apiToken HOSTNAME=$hostname bash 2>&1 | '
'tee /tmp/infect.log',
'labels': {},
'automount': true,
'location': region!,
};
print('Decoded data: $data');
serverCreateResponse = await client.post(
'/servers',
data: data,
);
print(serverCreateResponse.data);
serverDetails = ServerHostingDetails(
id: serverCreateResponse.data['server']['id'],
ip4: serverCreateResponse.data['server']['public_net']['ipv4']['ip'],
createTime: DateTime.now(),
volume: volume,
apiToken: apiToken,
provider: ServerProviderType.hetzner,
);
success = true;
} on DioError catch (e) {
print(e);
hetznerError = e;
} catch (e) {
print(e);
} finally {
client.close();
}
if (!success) {
await Future.delayed(const Duration(seconds: 10));
await deleteVolume(volume);
}
String? apiResultMessage = serverCreateResponse?.statusMessage;
if (hetznerError != null &&
hetznerError.response!.data['error']['code'] == 'uniqueness_error') {
apiResultMessage = 'uniqueness_error';
}
return GenericResult(
data: serverDetails,
success: success && hetznerError == null,
code: serverCreateResponse?.statusCode ??
hetznerError?.response?.statusCode,
message: apiResultMessage,
);
}
Future<GenericResult<bool>> deleteServer({ Future<GenericResult<bool>> deleteServer({
required final String domainName, required final String domainName,
}) async { }) async {

View File

@ -1,9 +1,8 @@
import 'package:selfprivacy/config/get_it_config.dart'; import 'package:selfprivacy/config/get_it_config.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/api_controller.dart';
import 'package:selfprivacy/logic/common_enum/common_enum.dart'; import 'package:selfprivacy/logic/common_enum/common_enum.dart';
import 'package:selfprivacy/logic/cubit/metrics/metrics_cubit.dart'; import 'package:selfprivacy/logic/cubit/metrics/metrics_cubit.dart';
import 'package:selfprivacy/logic/models/metrics.dart'; import 'package:selfprivacy/logic/providers/providers_controller.dart';
class MetricsLoadException implements Exception { class MetricsLoadException implements Exception {
MetricsLoadException(this.message); MetricsLoadException(this.message);
@ -12,8 +11,7 @@ class MetricsLoadException implements Exception {
class MetricsRepository { class MetricsRepository {
Future<MetricsLoaded> getMetrics(final Period period) async { Future<MetricsLoaded> getMetrics(final Period period) async {
final providerApiFactory = ApiController.currentServerProviderApiFactory; if (ProvidersController.currentServerProvider == null) {
if (providerApiFactory == null) {
throw MetricsLoadException('Server Provider data is null'); throw MetricsLoadException('Server Provider data is null');
} }
@ -33,20 +31,19 @@ class MetricsRepository {
} }
final serverId = getIt<ApiConfigModel>().serverDetails!.id; final serverId = getIt<ApiConfigModel>().serverDetails!.id;
final ServerMetrics? metrics = final result = await ProvidersController.currentServerProvider!.getMetrics(
await providerApiFactory.getServerProvider().getMetrics( serverId,
serverId, start,
start, end,
end, );
);
if (metrics == null) { if (result.data == null || !result.success) {
throw MetricsLoadException('Metrics data is null'); throw MetricsLoadException('Metrics data is null');
} }
return MetricsLoaded( return MetricsLoaded(
period: period, period: period,
metrics: metrics, metrics: result.data!,
); );
} }
} }

View File

@ -134,7 +134,7 @@ class ServerInstallationCubit extends Cubit<ServerInstallationState> {
Future<List<ServerType>> fetchAvailableTypesByLocation( Future<List<ServerType>> fetchAvailableTypesByLocation(
final ServerProviderLocation location, final ServerProviderLocation location,
) async { ) async {
if (ApiController.currentServerProviderApiFactory == null) { if (ProvidersController.currentServerProvider == null) {
return []; return [];
} }
@ -754,6 +754,7 @@ class ServerInstallationCubit extends Cubit<ServerInstallationState> {
void clearAppConfig() { void clearAppConfig() {
closeTimer(); closeTimer();
ApiController.clearProviderApiFactories(); ApiController.clearProviderApiFactories();
ProvidersController.clearProviders();
repository.clearAppConfig(); repository.clearAppConfig();
emit(const ServerInstallationEmpty()); emit(const ServerInstallationEmpty());
} }

View File

@ -332,15 +332,24 @@ class ServerInstallationRepository {
return api.isHttpServerWorking(); return api.isHttpServerWorking();
} }
Future<ServerHostingDetails> restart() async => Future<ServerHostingDetails> restart() async {
ApiController.currentServerProviderApiFactory! final server = getIt<ApiConfigModel>().serverDetails!;
.getServerProvider()
.restart();
Future<ServerHostingDetails> powerOn() async => final result = await ProvidersController.currentServerProvider!.restart(
ApiController.currentServerProviderApiFactory! server.id,
.getServerProvider() );
.powerOn();
if (result.success && result.data != null) {
server.copyWith(startTime: result.data);
}
return server;
}
Future<ServerHostingDetails> powerOn() async {
final server = getIt<ApiConfigModel>().serverDetails!;
return startServer(server);
}
Future<ServerRecoveryCapabilities> getRecoveryCapabilities( Future<ServerRecoveryCapabilities> getRecoveryCapabilities(
final ServerDomain serverDomain, final ServerDomain serverDomain,

View File

@ -1,6 +1,7 @@
import 'package:selfprivacy/logic/api_maps/generic_result.dart'; import 'package:selfprivacy/logic/api_maps/generic_result.dart';
import 'package:selfprivacy/logic/models/callback_dialogue_branching.dart'; import 'package:selfprivacy/logic/models/callback_dialogue_branching.dart';
import 'package:selfprivacy/logic/models/launch_installation_data.dart'; import 'package:selfprivacy/logic/models/launch_installation_data.dart';
import 'package:selfprivacy/logic/models/metrics.dart';
import 'package:selfprivacy/logic/models/server_provider_location.dart'; import 'package:selfprivacy/logic/models/server_provider_location.dart';
import 'package:selfprivacy/logic/models/server_type.dart'; import 'package:selfprivacy/logic/models/server_type.dart';
@ -18,6 +19,11 @@ abstract class ServerProvider {
); );
Future<GenericResult<DateTime?>> powerOn(final int serverId); Future<GenericResult<DateTime?>> powerOn(final int serverId);
Future<GenericResult<DateTime?>> restart(final int serverId); Future<GenericResult<DateTime?>> restart(final int serverId);
Future<GenericResult<ServerMetrics?>> getMetrics(
final int serverId,
final DateTime start,
final DateTime end,
);
GenericResult<bool> get success => GenericResult(success: true, data: true); GenericResult<bool> get success => GenericResult(success: true, data: true);
} }

View File

@ -289,6 +289,7 @@ class HetznerServerProvider extends ServerProvider {
return GenericResult(success: true, data: metadata); return GenericResult(success: true, data: metadata);
} }
@override
Future<GenericResult<ServerMetrics?>> getMetrics( Future<GenericResult<ServerMetrics?>> getMetrics(
final int serverId, final int serverId,
final DateTime start, final DateTime start,