Skip to content

Commit 02bb015

Browse files
committed
[sm,servicemanager] Implement remove service method
Signed-off-by: Mykhailo Lohvynenko <Mykhailo_Lohvynenko@epam.com>
1 parent 1e88a98 commit 02bb015

File tree

5 files changed

+106
-30
lines changed

5 files changed

+106
-30
lines changed

include/aos/sm/servicemanager.hpp

+17-1
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,14 @@ class ServiceManagerItf {
229229
*/
230230
virtual Error ValidateService(const ServiceData& service) = 0;
231231

232+
/**
233+
* Removes service.
234+
*
235+
* @param service service to remove.
236+
* @return Error.
237+
*/
238+
virtual Error RemoveService(const ServiceData& service) = 0;
239+
232240
/**
233241
* Destroys storage interface.
234242
*/
@@ -330,6 +338,14 @@ class ServiceManager : public ServiceManagerItf, public spaceallocator::ItemRemo
330338
*/
331339
Error ValidateService(const ServiceData& service) override;
332340

341+
/**
342+
* Removes service.
343+
*
344+
* @param service service to remove.
345+
* @return Error.
346+
*/
347+
Error RemoveService(const ServiceData& service) override;
348+
333349
/**
334350
* Removes item.
335351
*
@@ -349,7 +365,7 @@ class ServiceManager : public ServiceManagerItf, public spaceallocator::ItemRemo
349365

350366
Error RemoveDamagedServiceFolders(const Array<ServiceData>& services);
351367
Error RemoveOutdatedServices(const Array<ServiceData>& services);
352-
Error RemoveService(const ServiceData& service);
368+
Error RemoveServiceFromSystem(const ServiceData& service);
353369
Error InstallService(const ServiceInfo& service);
354370
Error SetServiceState(const ServiceData& service, ServiceState state);
355371
RetWithError<StaticString<cFilePathLen>> DigestToPath(const String& imagePath, const String& digest);

src/sm/servicemanager/servicemanager.cpp

+34-28
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,28 @@ Error ServiceManager::ValidateService(const ServiceData& service)
262262
return ErrorEnum::eNone;
263263
}
264264

265+
Error ServiceManager::RemoveService(const ServiceData& service)
266+
{
267+
if (auto err = RemoveServiceFromSystem(service); !err.IsNone()) {
268+
return AOS_ERROR_WRAP(err);
269+
}
270+
271+
if (service.mState == ServiceStateEnum::eCached) {
272+
auto [allocationId, err] = FormatAllocatorItemID(service);
273+
274+
if (!err.IsNone()) {
275+
LOG_ERR() << "Can't format allocator item ID: serviceID=" << service.mServiceID
276+
<< ", version=" << service.mVersion << ", err=" << err;
277+
} else {
278+
mServiceSpaceAllocator->RestoreOutdatedItem(allocationId);
279+
}
280+
}
281+
282+
mServiceSpaceAllocator->FreeSpace(service.mSize);
283+
284+
return ErrorEnum::eNone;
285+
}
286+
265287
Error ServiceManager::RemoveItem(const String& id)
266288
{
267289
StaticArray<StaticString<Max(cServiceIDLen, cVersionLen)>, 2> splitted;
@@ -277,16 +299,13 @@ Error ServiceManager::RemoveItem(const String& id)
277299

278300
mStorage->GetServiceVersions(serviceID, *services);
279301

280-
for (const auto& service : *services) {
281-
if (service.mVersion == version) {
282-
if (auto err = FS::RemoveAll(service.mImagePath); !err.IsNone()) {
283-
return AOS_ERROR_WRAP(err);
284-
}
302+
auto it = services->FindIf([&version](const ServiceData& service) { return service.mVersion == version; });
303+
if (it == services->end()) {
304+
return AOS_ERROR_WRAP(ErrorEnum::eNotFound);
305+
}
285306

286-
if (auto err = RemoveService(service); !err.IsNone()) {
287-
return AOS_ERROR_WRAP(err);
288-
}
289-
}
307+
if (auto err = RemoveServiceFromSystem(*it); !err.IsNone()) {
308+
return AOS_ERROR_WRAP(err);
290309
}
291310

292311
return ErrorEnum::eNone;
@@ -387,7 +406,7 @@ Error ServiceManager::RemoveDamagedServiceFolders(const Array<ServiceData>& serv
387406

388407
LOG_WRN() << "Service missing: imagePath=" << service.mImagePath;
389408

390-
if (auto err = RemoveService(service); !err.IsNone()) {
409+
if (auto err = RemoveServiceFromSystem(service); !err.IsNone()) {
391410
return AOS_ERROR_WRAP(err);
392411
}
393412
}
@@ -427,7 +446,7 @@ Error ServiceManager::RemoveOutdatedServices(const Array<ServiceData>& services)
427446

428447
LOG_DBG() << "Service outdated: serviceID=" << service.mServiceID << ", version=" << service.mVersion;
429448

430-
if (auto err = RemoveService(service); !err.IsNone()) {
449+
if (auto err = RemoveServiceFromSystem(service); !err.IsNone()) {
431450
return AOS_ERROR_WRAP(err);
432451
}
433452

@@ -444,28 +463,15 @@ Error ServiceManager::RemoveOutdatedServices(const Array<ServiceData>& services)
444463
return ErrorEnum::eNone;
445464
}
446465

447-
Error ServiceManager::RemoveService(const ServiceData& service)
466+
Error ServiceManager::RemoveServiceFromSystem(const ServiceData& service)
448467
{
449-
LOG_INF() << "Remove service: serviceID=" << service.mServiceID << ", providerID=" << service.mProviderID
450-
<< ", version=" << service.mVersion << ", path=" << service.mImagePath;
468+
LOG_DBG() << "Remove service: serviceID=" << service.mServiceID << ", version=" << service.mVersion
469+
<< ", path=" << service.mImagePath;
451470

452471
if (auto err = FS::RemoveAll(service.mImagePath); !err.IsNone()) {
453-
err = AOS_ERROR_WRAP(err);
454-
}
455-
456-
if (service.mState == ServiceStateEnum::eCached) {
457-
auto [allocationId, err] = FormatAllocatorItemID(service);
458-
459-
if (!err.IsNone()) {
460-
LOG_ERR() << "Can't format allocator item ID: serviceID=" << service.mServiceID
461-
<< ", version=" << service.mVersion << ", err=" << err;
462-
} else {
463-
mServiceSpaceAllocator->RestoreOutdatedItem(allocationId);
464-
}
472+
return AOS_ERROR_WRAP(err);
465473
}
466474

467-
mServiceSpaceAllocator->FreeSpace(service.mSize);
468-
469475
if (auto err = mStorage->RemoveService(service.mServiceID, service.mVersion); !err.IsNone()) {
470476
return AOS_ERROR_WRAP(err);
471477
}

tests/sm/layermanager/layermanager_test.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ TEST_F(LayerManagerTest, RemoveLayer)
359359
ASSERT_TRUE(mManager.ProcessDesiredLayers(desiredLayers, *layerStatuses).IsNone());
360360

361361
if (auto it
362-
= layerStatuses->FindIf([](const auto& status) { return status.mStatus != ComponentStatusEnum::eInstalled; });
362+
= layerStatuses->FindIf([](const auto& status) { return status.mStatus != ItemStatusEnum::eInstalled; });
363363
it != layerStatuses->end() || layerStatuses->Size() != desiredLayers.Size()) {
364364
FAIL() << "Invalid layer status";
365365
}

tests/sm/servicemanager/servicemanager_test.cpp

+41
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,47 @@ TEST_F(ServiceManagerTest, ProcessDesiredServicesOnInvalidService)
375375
}
376376
}
377377

378+
TEST_F(ServiceManagerTest, RemoveService)
379+
{
380+
ServiceManager serviceManager;
381+
382+
ASSERT_TRUE(serviceManager
383+
.Init(mConfig, mOCIManager, mDownloader, mStorage, mServiceSpaceAllocator, mDownloadSpaceAllocator,
384+
mImageHandler)
385+
.IsNone());
386+
387+
const auto testData = std::vector<ServiceInfo> {
388+
{"service1", "provider1", "1.0.0", 0, "url", {}, 0},
389+
{"service2", "provider2", "1.0.0", 0, "url", {}, 0},
390+
{"service3", "provider3", "1.0.0", 0, "url", {}, 0},
391+
{"service4", "provider4", "1.0.0", 0, "url", {}, 0},
392+
};
393+
394+
for (const auto& service : testData) {
395+
const auto imagePath = FS::JoinPath(cServicesDir, service.mServiceID);
396+
397+
mImageHandler.SetInstallResult(FS::JoinPath(cDownloadDir, service.mServiceID), imagePath);
398+
mImageHandler.SetCalculateDigestResult(FS::JoinPath(imagePath, "manifest.json"), "sha256:123");
399+
}
400+
401+
const auto desiredServices = Array<ServiceInfo>(testData.data(), testData.size());
402+
auto serviceStatuses = std::make_unique<ServiceStatusStaticArray>();
403+
404+
ASSERT_TRUE(serviceManager.ProcessDesiredServices(desiredServices, *serviceStatuses).IsNone());
405+
406+
auto services = std::make_unique<ServiceDataStaticArray>();
407+
ASSERT_TRUE(mStorage.GetAllServices(*services).IsNone());
408+
ASSERT_EQ(services->Size(), testData.size());
409+
410+
for (const auto& service : *services) {
411+
ASSERT_TRUE(serviceManager.RemoveService(service).IsNone());
412+
}
413+
414+
services->Clear();
415+
ASSERT_TRUE(mStorage.GetAllServices(*services).IsNone());
416+
ASSERT_TRUE(services->IsEmpty());
417+
}
418+
378419
TEST_F(ServiceManagerTest, GetImageParts)
379420
{
380421
ServiceManager serviceManager;

tests/sm/stubs/servicemanagerstub.hpp

+13
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,19 @@ class ServiceManagerStub : public ServiceManagerItf {
251251
return ErrorEnum::eNone;
252252
}
253253

254+
/**
255+
* Removes service.
256+
*
257+
* @param service service to remove.
258+
* @return Error.
259+
*/
260+
Error RemoveService(const ServiceData& service) override
261+
{
262+
(void)service;
263+
264+
return ErrorEnum::eNone;
265+
}
266+
254267
private:
255268
std::mutex mMutex;
256269
std::vector<ServiceData> mServicesData;

0 commit comments

Comments
 (0)