Status: ✅ ALL CODE CHANGES IMPLEMENTED AND IN PLACE
Date: February 23, 2026 Scope: Complete upgrade from cloud-store-sdk v1.4.8.1 → v2.0.0 with Guice StorageModule pattern
- Location:
platform-modules/mimetype-manager/src/main/java/modules/StorageModule.java - Status: ✅ Created
- Details:
- Guice
AbstractModulewith@Provides @Singletonmethod provideStorageService()returnsIStorageService(not BaseStorageService)- Uses
StorageConfig.StorageTypeandStorageConfig.AuthTypeinner classes - Implements ACCESS_KEY vs OIDC switching logic
- For ACCESS_KEY: reads
cloud_storage_keyandcloud_storage_secretfrom config - For OIDC: relies on Azure SDK's credential chain (Workload Identity)
- Guice
- Location:
platform-modules/mimetype-manager/src/main/scala/org/sunbird/cloudstore/StorageService.scala - Status: ✅ Modified for constructor injection
- Details:
@Singletonannotation fromjavax.inject- Constructor:
@Inject()(storageService: IStorageService) - Parameter type:
IStorageService(correct v2.0.0 interface) getService: IStorageServicemethod returns injected instance- All utility methods preserved (uploadFile, uploadDirectory, getSignedURL, etc.)
- Location:
platform-modules/mimetype-manager/src/main/scala/org/sunbird/mimetype/factory/MimeTypeManagerFactory.scala - Status: ✅ Updated to lazy Injector pattern
- Details:
- Changed from
implicit val ss: StorageService = new StorageServiceto lazy initialization - Uses
play.api.Play.current.injector.instanceOf[StorageService] - Enables deferred instantiation until Play context is available
- Changed from
- Location:
platform-modules/mimetype-manager/src/main/scala/org/sunbird/mimetype/ecml/processor/IProcessor.scala - Status: ✅ Updated to lazy Injector pattern
- Details:
- Same lazy Injector pattern as MimeTypeManagerFactory
- Abstract base class for ECML processors
- Status: ✅ All updated with constructor parameter injection
- Files:
platform-modules/mimetype-manager/src/test/scala/org/sunbird/cloudstore/StorageServiceTest.scalaplatform-modules/mimetype-manager/src/test/scala/org/sunbird/mimetype/mgr/impl/PluginMimeTypeMgrImplTest.scalaplatform-modules/mimetype-manager/src/test/scala/org/sunbird/mimetype/mgr/impl/DocumentMimeTypeMgrImplTest.scalaplatform-modules/mimetype-manager/src/test/scala/org/sunbird/mimetype/mgr/impl/HtmlMimeTypeMgrImplTest.scalaplatform-modules/mimetype-manager/src/test/scala/org/sunbird/mimetype/mgr/impl/CollectionMimeTypeMgrImplTest.scalaplatform-modules/mimetype-manager/src/test/scala/org/sunbird/mimetype/mgr/impl/YouTubeMimeTypeMgrImplTest.scalaplatform-modules/mimetype-manager/src/test/scala/org/sunbird/mimetype/mgr/impl/AssetMimeTypeMgrImplTest.scalaplatform-modules/mimetype-manager/src/test/scala/org/sunbird/mimetype/mgr/impl/H5PMimeTypeMgrImplTest.scalaplatform-modules/mimetype-manager/src/test/scala/org/sunbird/mimetype/mgr/BaseMimeTypeManagerTest.scala
- Pattern:
new StorageService(null.asInstanceOf[org.sunbird.cloud.storage.IStorageService])
1. platform-modules/mimetype-manager/pom.xml
- ✅ Added:
javax.inject:javax.inject:1(Guice annotations) - ✅ Added:
org.sunbird:cloud-storage-sdk-api:2.0.0(compile-time) - ✅ Added:
org.sunbird:cloud-storage-sdk-azure:2.0.0(runtime scope for ServiceLoader)
2. content-api/content-service/pom.xml
- ✅ Same cloud-storage-sdk dependencies as mimetype-manager
3. knowlg-service/pom.xml
- ✅ Added explicit cloud-storage-sdk dependencies (previously only transitive through content-actors)
- ✅
play.modules.enabled += modules.StorageModule(line 140) - ✅ Cloud storage config block:
cloud_storage_type="azure" cloud_storage_auth_type="ACCESS_KEY" cloud_storage_key="" cloud_storage_secret="" cloud_storage_container="" cloud_storage_dial_container=""
- ✅
play.modules.enabled += modules.StorageModule(line 212) - ✅ Cloud storage config block with same defaults
- ✅ Removed legacy GCP-specific configuration keys
- ✅ Changed
cloud_storage_type=""→cloud_storage_type="azure"
- ✅ Added standard cloud storage config block (StorageModule NOT enabled — no cloud-using actors)
- ✅ Added standard cloud storage config block (StorageModule NOT enabled)
- ✅ Added standard cloud storage config block (StorageModule NOT enabled)
- ✅ Environment variables set:
ENV cloud_storage_type=azure ENV cloud_storage_auth_type=OIDC
- ✅ Environment variables set:
ENV cloud_storage_type=azure ENV cloud_storage_auth_type=OIDC
# In application.conf or as environment variables:
cloud_storage_type="azure"
cloud_storage_auth_type="ACCESS_KEY"
cloud_storage_key="<azure-storage-account-name>"
cloud_storage_secret="<azure-storage-account-key>"# In Dockerfile (already set):
ENV cloud_storage_type=azure
ENV cloud_storage_auth_type=OIDC
# Azure Workload Identity Environment Variables (injected by Kubernetes):
AZURE_CLIENT_ID=<...>
AZURE_TENANT_ID=<...>
AZURE_FEDERATED_TOKEN_FILE=/var/run/secrets/workload-identity-token| Aspect | Before (v1.4.8.1) | After (v2.0.0) |
|---|---|---|
| SDK Type | Monolithic Scala artifact | Multi-module Java SDK |
| Service Class | BaseStorageService (public) |
IStorageService (interface) |
| Initialization | Lazy init in StorageService | Guice @Provides @Singleton |
| Dependency Injection | Manual via factory | Guice constructor injection |
| DI Pattern | Not consistent | Play Framework DI |
| Auth Type | Hardcoded | Configurable (ACCESS_KEY/OIDC) |
| CSP Discovery | Manual imports | Java ServiceLoader |
| Config Source | Inline builder | Play Config object |
cd /Users/mahesh/Code/Sunbird-Knowlg/knowledge-platform
mvn clean install -DskipTestsExpected: All modules compile without errors, especially:
platform-modules/mimetype-managercontent-api/content-serviceknowlg-service
mvn test -pl platform-modules/mimetype-managerExpected: 5 getMimeType tests + 1 getContainerName exception test pass
export cloud_storage_auth_type=ACCESS_KEY
export cloud_storage_key=<azure-account-name>
export cloud_storage_secret=<azure-account-key>
cd content-api/content-service && mvn play2:run
curl http://localhost:9000/healthExpected: Service starts without errors, health check responds
docker build -f build/content-service/Dockerfile .
docker build -f build/knowlg-service/Dockerfile .Expected: Docker images build successfully with OIDC defaults
- Maven Requirement: Project build requires Maven 3.9+ (not yet installed in current environment)
- ServiceLoader Discovery: CSP implementations are discovered at runtime; ensure appropriate CSP jar is on runtime classpath
- Credentials Visibility: ACCESS_KEY credentials should never be committed to version control; use environment variables or local config overrides
- Test Null Stubs: Unit tests pass
nullforIStorageServiceparameter because they don't invokegetService()or mock it entirely
| File | Action | Type |
|---|---|---|
modules/StorageModule.java |
CREATE | Core Module |
StorageService.scala |
MODIFY | Core Service |
MimeTypeManagerFactory.scala |
MODIFY | Factory |
IProcessor.scala |
MODIFY | Abstract Base |
9 test files |
MODIFY | Tests |
4 pom.xml files |
MODIFY | Dependencies |
5 application.conf files |
MODIFY | Configuration |
2 Dockerfile files |
MODIFY | Docker |
Total Changes: 24 files modified/created across 2 major versions
- Install Maven 3.9+ on your development machine
- Run
mvn clean install -DskipTeststo verify compilation - Run
mvn test -pl platform-modules/mimetype-managerto verify tests - Run services locally with ACCESS_KEY credentials for development
- Deploy to Kubernetes with OIDC-enabled Dockerfile