Implement endpoints for hetzner volumes

pull/97/head
NaiJi ✨ 2022-06-24 00:34:09 +03:00
parent c4f62e012b
commit 352351663f
2 changed files with 163 additions and 18 deletions

View File

@ -56,24 +56,162 @@ class HetznerApi extends ApiMap {
} }
} }
Future<ServerVolume> createVolume() async { Future<ServerVolume?> createVolume() async {
ServerVolume? volume;
final Response dbCreateResponse;
final Dio client = await getClient(); final Dio client = await getClient();
final Response dbCreateResponse = await client.post( try {
'/volumes', dbCreateResponse = await client.post(
data: { '/volumes',
'size': 10, data: {
'name': StringGenerators.dbStorageName(), 'size': 10,
'labels': {'labelkey': 'value'}, 'name': StringGenerators.dbStorageName(),
'location': 'fsn1', 'labels': {'labelkey': 'value'},
'automount': false, 'location': 'fsn1',
'format': 'ext4' 'automount': false,
}, 'format': 'ext4'
); },
final dbId = dbCreateResponse.data['volume']['id']; );
return ServerVolume( final dbId = dbCreateResponse.data['volume']['id'];
id: dbId, final dbName = dbCreateResponse.data['volume']['name'];
name: dbCreateResponse.data['volume']['name'], volume = ServerVolume(
); id: dbId,
name: dbName,
);
} catch (e) {
print(e);
} finally {
client.close();
}
return volume;
}
Future<List<ServerVolume>> getVolumes(final String? status) async {
final List<ServerVolume> volumes = [];
final Response dbGetResponse;
final Dio client = await getClient();
try {
dbGetResponse = await client.get(
'/volumes',
queryParameters: {
'status': status,
},
);
final List<dynamic> rawVolumes = dbGetResponse.data['volumes'];
for (final rawVolume in rawVolumes) {
final int dbId = rawVolume['id'];
final String dbName = rawVolume['name'];
final volume = ServerVolume(
id: dbId,
name: dbName,
);
volumes.add(volume);
}
} catch (e) {
print(e);
} finally {
client.close();
}
return volumes;
}
Future<ServerVolume?> getVolume(final int id) async {
ServerVolume? volume;
final Response dbGetResponse;
final Dio client = await getClient();
try {
dbGetResponse = await client.get('/volumes/$id');
final int dbId = dbGetResponse.data['volume']['id'];
final String dbName = dbGetResponse.data['volume']['name'];
volume = ServerVolume(
id: dbId,
name: dbName,
);
} catch (e) {
print(e);
} finally {
client.close();
}
return volume;
}
void deleteVolume(final int id) async {
final Dio client = await getClient();
try {
await client.delete('/volumes/$id');
} catch (e) {
print(e);
} finally {
client.close();
}
}
Future<bool> attachVolume(final int volumeId, final int serverId) async {
bool success = false;
final Response dbPostResponse;
final Dio client = await getClient();
try {
dbPostResponse = await client.post(
'/volumes/$volumeId/actions/attach',
data: {
'automount': true,
'server': serverId,
},
);
success = dbPostResponse.data['action']['status'].toString() != 'error';
} catch (e) {
print(e);
} finally {
client.close();
}
return success;
}
Future<bool> detachVolume(final int volumeId) async {
bool success = false;
final Response dbPostResponse;
final Dio client = await getClient();
try {
dbPostResponse = await client.post('/volumes/$volumeId/actions/detach');
success = dbPostResponse.data['action']['status'].toString() != 'error';
} catch (e) {
print(e);
} finally {
client.close();
}
return success;
}
Future<bool> resizeVolume(final int volumeId, final int sizeGb) async {
bool success = false;
final Response dbPostResponse;
final Dio client = await getClient();
try {
dbPostResponse = await client.post(
'/volumes/$volumeId/actions/resize',
data: {
'size': sizeGb,
},
);
success = dbPostResponse.data['action']['status'].toString() != 'error';
} catch (e) {
print(e);
} finally {
client.close();
}
return success;
} }
Future<ServerHostingDetails?> createServer({ Future<ServerHostingDetails?> createServer({

View File

@ -212,7 +212,13 @@ class ServerInstallationRepository {
late ServerVolume dataBase; late ServerVolume dataBase;
try { try {
dataBase = await hetznerApi.createVolume(); final ServerVolume? createdVolume = await hetznerApi.createVolume();
if (createdVolume == null) {
print('Volume is not created!');
return;
}
dataBase = createdVolume;
final ServerHostingDetails? serverDetails = await hetznerApi.createServer( final ServerHostingDetails? serverDetails = await hetznerApi.createServer(
cloudFlareKey: cloudFlareKey, cloudFlareKey: cloudFlareKey,
@ -220,6 +226,7 @@ class ServerInstallationRepository {
domainName: domainName, domainName: domainName,
dataBase: dataBase, dataBase: dataBase,
); );
if (serverDetails == null) { if (serverDetails == null) {
print('Server is not initialized!'); print('Server is not initialized!');
return; return;