diff --git a/Makefile b/Makefile index 0c28c5b32cf56b4b13368d7d74fce0a1bf9b3817..cab6622c18f87c49b7b3db7dce7cb7f8281220c3 100644 --- a/Makefile +++ b/Makefile @@ -64,10 +64,10 @@ start-tunnel: release-autograde: - docker buildx build --platform linux/amd64,linux/arm64 --push -t autograde/autograde-service:1.0.3 autograde-service/ + docker buildx build --platform linux/amd64,linux/arm64 --push -t autograde/autograde-service:1.0.4 autograde-service/ release-moodle: - docker buildx build --platform linux/amd64,linux/arm64 --push -t autograde/moodle:1.0.3 -f Dockerfile-moodle-with-autograde ./ + docker buildx build --platform linux/amd64,linux/arm64 --push -t autograde/moodle:1.0.4 -f Dockerfile-moodle-with-autograde ./ release-submission-manager: - docker buildx build --platform linux/amd64,linux/arm64 --push -t autograde/submission-manager:1.0.3 autograde-submission-manager/ + docker buildx build --platform linux/amd64,linux/arm64 --push -t autograde/submission-manager:1.0.4 autograde-submission-manager/ diff --git a/autograde-service/pom.xml b/autograde-service/pom.xml index cca7c7a5c047e5cd0f867cb350b93cd763eb5606..5b4cefaf113be837f1f46f701cef684e91d4beb3 100644 --- a/autograde-service/pom.xml +++ b/autograde-service/pom.xml @@ -13,7 +13,7 @@ <!-- HR : Project definition--> <groupId>ch.epfl.autograde</groupId> <artifactId>autograde-service</artifactId> - <version>1.0.3</version> + <version>1.0.4</version> <name>autograde-service</name> <description> diff --git a/autograde-service/src/main/java/ch/epfl/autograde/AutogradeServiceApplication.java b/autograde-service/src/main/java/ch/epfl/autograde/AutogradeServiceApplication.java index 5d854418151d33993be8a93eeff4d4a488db7c38..f70b887122fee9ec2aa6b842a3b2684f2b0670f3 100644 --- a/autograde-service/src/main/java/ch/epfl/autograde/AutogradeServiceApplication.java +++ b/autograde-service/src/main/java/ch/epfl/autograde/AutogradeServiceApplication.java @@ -1,10 +1,8 @@ package ch.epfl.autograde; -import ch.epfl.autograde.config.properties.AutogradeConfigProperties; -import ch.epfl.autograde.config.properties.MoodleConfigProperties; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.context.properties.ConfigurationPropertiesScan; /** * ??? @@ -12,7 +10,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties * @author Hamza REMMAL (hamza.remmal@epfl.ch) */ @SpringBootApplication -@EnableConfigurationProperties({AutogradeConfigProperties.class, MoodleConfigProperties.class}) +@ConfigurationPropertiesScan public class AutogradeServiceApplication { /** diff --git a/autograde-service/src/main/java/ch/epfl/autograde/api/v1/model/ImagePullPolicy.java b/autograde-service/src/main/java/ch/epfl/autograde/api/v1/model/ImagePullPolicy.java new file mode 100644 index 0000000000000000000000000000000000000000..dc466ec6a390734f4945ff43b2d7183254d02d65 --- /dev/null +++ b/autograde-service/src/main/java/ch/epfl/autograde/api/v1/model/ImagePullPolicy.java @@ -0,0 +1,12 @@ +package ch.epfl.autograde.api.v1.model; + +/** + * + * @since 1.1.0 + * @see <a href="https://kubernetes.io/docs/concepts/containers/images/#image-pull-policy">Kubernetes Official Documentation</a> + */ +public enum ImagePullPolicy { + Never, + Always, + IfNotPresent +} diff --git a/autograde-service/src/main/java/ch/epfl/autograde/api/v1/service/AutogradeService.java b/autograde-service/src/main/java/ch/epfl/autograde/api/v1/service/AutogradeService.java index 5155e30250aaf3a269438eb3b3aaf975daa8318e..78f106137322a547e92e88f6ed4a9475a0af4e3d 100644 --- a/autograde-service/src/main/java/ch/epfl/autograde/api/v1/service/AutogradeService.java +++ b/autograde-service/src/main/java/ch/epfl/autograde/api/v1/service/AutogradeService.java @@ -1,6 +1,6 @@ package ch.epfl.autograde.api.v1.service; -import ch.epfl.autograde.config.properties.AutogradeConfigProperties; +import ch.epfl.autograde.properties.AutogradeConfigProperties; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; diff --git a/autograde-service/src/main/java/ch/epfl/autograde/api/v1/service/KubernetesJobService.java b/autograde-service/src/main/java/ch/epfl/autograde/api/v1/service/KubernetesJobService.java index 76e1b812f72d847bfc1e997054f1b6d40397af2d..586e02869bc7667e49ed319bfcf71c8e8a137842 100644 --- a/autograde-service/src/main/java/ch/epfl/autograde/api/v1/service/KubernetesJobService.java +++ b/autograde-service/src/main/java/ch/epfl/autograde/api/v1/service/KubernetesJobService.java @@ -1,15 +1,17 @@ package ch.epfl.autograde.api.v1.service; import ch.epfl.autograde.api.v1.entity.SubmissionInfo; +import ch.epfl.autograde.properties.AutogradeJobConfig; +import ch.epfl.autograde.properties.AutogradeJobImageConfig; +import ch.epfl.autograde.properties.AutogradeManagerConfig; import ch.epfl.autograde.utils.KubernetesPreprocessor; import io.fabric8.kubernetes.api.model.*; import io.fabric8.kubernetes.api.model.batch.v1.Job; import io.fabric8.kubernetes.api.model.batch.v1.JobBuilder; import io.fabric8.kubernetes.api.model.batch.v1.JobSpecBuilder; import io.fabric8.kubernetes.client.KubernetesClient; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.util.Map; @@ -23,6 +25,7 @@ import static java.lang.String.valueOf; */ @Slf4j @Service +@RequiredArgsConstructor public final class KubernetesJobService { /** Client to communicate with the underlying k8s cluster */ @@ -39,7 +42,11 @@ public final class KubernetesJobService { private final AutogradeService autograde; /** Namespace to run the jobs in - where the current instance of autograde lives in */ - private final String JOBS_NAMESPACE; + private final AutogradeJobConfig jobConfig; + + private final AutogradeJobImageConfig jobImageConfig; + + private final AutogradeManagerConfig managerConfig; /** Enum to represent the different states of a grading job */ public enum JobStatus { @@ -53,21 +60,6 @@ public final class KubernetesJobService { NOT_FOUND } - @Autowired - public KubernetesJobService(KubernetesClient k8s, - KubernetesSecretService secrets, - MoodleWebService moodle, - IntegrityService integrity, - AutogradeService autograde, - @Value("${autograde.jobs.namespace}") String namespace) { - this.k8s = k8s; - this.secrets = secrets; - this.moodle = moodle; - this.integrity = integrity; - this.autograde = autograde; - this.JOBS_NAMESPACE = namespace; - } - public String create_grading_submission_job(int id) { // Generate the job name var jobName = get_job_name(id); @@ -103,7 +95,7 @@ public final class KubernetesJobService { k8s.batch() .v1() .jobs() - .inNamespace(JOBS_NAMESPACE) + .inNamespace(jobConfig.namespace()) .resource(job) .create(); } catch (Exception e) { @@ -125,7 +117,7 @@ public final class KubernetesJobService { var job = k8s.batch() .v1() .jobs() - .inNamespace(JOBS_NAMESPACE) + .inNamespace(jobConfig.namespace()) .withName(jobName) .get(); if (job == null) { @@ -191,6 +183,7 @@ public final class KubernetesJobService { return new ContainerBuilder() .withName("init") .withImage(autograde.getSubmissionManager()) + .withImagePullPolicy(managerConfig.pullPolicy().toString()) .withCommand("java", "-jar", "autograde-submission-manager.jar", autograde.getUrl(), autograde.api_key(), @@ -225,7 +218,7 @@ public final class KubernetesJobService { return new ContainerBuilder() .withName("grader") .withImage(image_name) - .withImagePullPolicy("Always") + .withImagePullPolicy(jobImageConfig.pullPolicy().toString()) .withVolumeMounts(new VolumeMountBuilder() .withName(volume.getName()) .withMountPath("/data") @@ -257,6 +250,7 @@ public final class KubernetesJobService { return new ContainerBuilder() .withName("cleanup") .withImage(autograde.getSubmissionManager()) + .withImagePullPolicy(managerConfig.pullPolicy().toString()) .withCommand("java", "-jar", "autograde-submission-manager.jar", autograde.getUrl(), autograde.api_key(), @@ -329,7 +323,7 @@ public final class KubernetesJobService { .build()) .build()) .withBackoffLimit(2) // failed jobs can be retried twice - .withTtlSecondsAfterFinished(60 * 60 * 2) // 2 hours + .withTtlSecondsAfterFinished(jobConfig.ttl()) // 2 hours .build()) .build(); } diff --git a/autograde-service/src/main/java/ch/epfl/autograde/api/v1/service/MoodleWebService.java b/autograde-service/src/main/java/ch/epfl/autograde/api/v1/service/MoodleWebService.java index 84014c9f1405675a95612927952d64f61164c6b1..bb7d3fa617c5826e43754631a57a846a28a7b42f 100644 --- a/autograde-service/src/main/java/ch/epfl/autograde/api/v1/service/MoodleWebService.java +++ b/autograde-service/src/main/java/ch/epfl/autograde/api/v1/service/MoodleWebService.java @@ -3,7 +3,7 @@ package ch.epfl.autograde.api.v1.service; import ch.epfl.autograde.api.v1.entity.AssignmentInfo; import ch.epfl.autograde.api.v1.entity.MoodleFile; import ch.epfl.autograde.api.v1.entity.SubmissionInfo; -import ch.epfl.autograde.config.properties.MoodleConfigProperties; +import ch.epfl.autograde.properties.MoodleConfigProperties; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; @@ -118,7 +118,7 @@ public final class MoodleWebService { "grade", grade, "files", new ObjectMapper().writeValueAsString(feedback) ); - System.out.println(new ObjectMapper().writeValueAsString(feedback)); + // HR : Call the moodle web service var response = call(FUNCTION_NAME, params, ofString()); log.info("call to moodle_upload_feedback returned {}", response.body()); diff --git a/autograde-service/src/main/java/ch/epfl/autograde/config/properties/AutogradeConfigProperties.java b/autograde-service/src/main/java/ch/epfl/autograde/properties/AutogradeConfigProperties.java similarity index 86% rename from autograde-service/src/main/java/ch/epfl/autograde/config/properties/AutogradeConfigProperties.java rename to autograde-service/src/main/java/ch/epfl/autograde/properties/AutogradeConfigProperties.java index 86ac1d816aef3ac62ba25113e505ab35afeec04b..82a165d26b7e2e70e80ec6df56a2d7e204241222 100644 --- a/autograde-service/src/main/java/ch/epfl/autograde/config/properties/AutogradeConfigProperties.java +++ b/autograde-service/src/main/java/ch/epfl/autograde/properties/AutogradeConfigProperties.java @@ -1,4 +1,4 @@ -package ch.epfl.autograde.config.properties; +package ch.epfl.autograde.properties; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/autograde-service/src/main/java/ch/epfl/autograde/properties/AutogradeJobConfig.java b/autograde-service/src/main/java/ch/epfl/autograde/properties/AutogradeJobConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..9d3a22ee069de301cf75b6c3c0fdd29dcdf3cc68 --- /dev/null +++ b/autograde-service/src/main/java/ch/epfl/autograde/properties/AutogradeJobConfig.java @@ -0,0 +1,9 @@ +package ch.epfl.autograde.properties; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties(prefix = "autograde.job") +public record AutogradeJobConfig ( + String namespace, + int ttl +){} diff --git a/autograde-service/src/main/java/ch/epfl/autograde/properties/AutogradeJobImageConfig.java b/autograde-service/src/main/java/ch/epfl/autograde/properties/AutogradeJobImageConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..f612b15937b82357fb3ab977216f16716be89cd7 --- /dev/null +++ b/autograde-service/src/main/java/ch/epfl/autograde/properties/AutogradeJobImageConfig.java @@ -0,0 +1,9 @@ +package ch.epfl.autograde.properties; + +import ch.epfl.autograde.api.v1.model.ImagePullPolicy; +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties(prefix = "autograde.job.image") +public record AutogradeJobImageConfig( + ImagePullPolicy pullPolicy +){} diff --git a/autograde-service/src/main/java/ch/epfl/autograde/properties/AutogradeManagerConfig.java b/autograde-service/src/main/java/ch/epfl/autograde/properties/AutogradeManagerConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..675c930685be7f7fcd29624808c8957f9646e245 --- /dev/null +++ b/autograde-service/src/main/java/ch/epfl/autograde/properties/AutogradeManagerConfig.java @@ -0,0 +1,11 @@ +package ch.epfl.autograde.properties; + +import ch.epfl.autograde.api.v1.model.ImagePullPolicy; +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties(prefix = "autograde.manager") +public record AutogradeManagerConfig( + String image, + ImagePullPolicy pullPolicy +) { +} diff --git a/autograde-service/src/main/java/ch/epfl/autograde/config/properties/MoodleConfigProperties.java b/autograde-service/src/main/java/ch/epfl/autograde/properties/MoodleConfigProperties.java similarity index 86% rename from autograde-service/src/main/java/ch/epfl/autograde/config/properties/MoodleConfigProperties.java rename to autograde-service/src/main/java/ch/epfl/autograde/properties/MoodleConfigProperties.java index 67c2a568185db754cc137bf4fbef3697752ca8ae..5edb97d31a98eb6b5f7fe74c709b450463febf90 100644 --- a/autograde-service/src/main/java/ch/epfl/autograde/config/properties/MoodleConfigProperties.java +++ b/autograde-service/src/main/java/ch/epfl/autograde/properties/MoodleConfigProperties.java @@ -1,4 +1,4 @@ -package ch.epfl.autograde.config.properties; +package ch.epfl.autograde.properties; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/autograde-service/src/main/resources/application.properties b/autograde-service/src/main/resources/application.properties index 402cd77f8c7325fce43e307ac48fd6c84fbf669b..47991e36e26d497d04afa23a774ac66bf90791af 100644 --- a/autograde-service/src/main/resources/application.properties +++ b/autograde-service/src/main/resources/application.properties @@ -3,4 +3,23 @@ logging.level.ch.epfl.cs107=${GRADING_SERVICE_LOG_LEVEL:-DEBUG} management.endpoint.health.enabled=true management.endpoints.web.exposure.include=health management.endpoint.health.show-details=always -autograde.version=@project.version@ \ No newline at end of file +autograde.version=@project.version@ + +# To keep it inline with the value in v1.0.1, v1.0.2 and v1.0.3 +# Note: Default in v1.0.0 was 2 days +autograde.job.ttl=7200 + +# Renaming of the variable, keeping the old env variable compatibility +# with v1.0.0, v1.0.1, v1.0.2 and v1.0.3 +# Note: Old name is not a default starting from v1.1.0 +autograde.job.namespace=${AUTOGRADE_JOBS_NAMESPACE} + +# Default value to keep it working when migrating from v1.0.0 to v1.0.3 +# Note: Default value starting from v1.2.0 is `if-not-present` +autograde.job.image.pull-policy=always + +# v1.0.0 up to v1.0.3 will default for `always` in case the tag is `latest` +# and to `if-not-present` otherwise. +# We choose to default to `if-not-present` since we have never used the `latest` tag +# Note: v1.2.x will default to `never` +autograde.manager.pull-policy=ifnotpresent \ No newline at end of file diff --git a/autograde-service/src/test/java/ch/epfl/autograde/config/properties/AutogradeConfigPropertiesTest.java b/autograde-service/src/test/java/ch/epfl/autograde/config/properties/AutogradeConfigPropertiesTest.java index e1ed903d57032add2cd005e6eb2325d04856c485..3c870b8b907c2a928acd1f353c7e6058f651da72 100644 --- a/autograde-service/src/test/java/ch/epfl/autograde/config/properties/AutogradeConfigPropertiesTest.java +++ b/autograde-service/src/test/java/ch/epfl/autograde/config/properties/AutogradeConfigPropertiesTest.java @@ -1,5 +1,6 @@ package ch.epfl.autograde.config.properties; +import ch.epfl.autograde.properties.AutogradeConfigProperties; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/autograde-service/src/test/java/ch/epfl/autograde/config/properties/MoodleConfigPropertiesTest.java b/autograde-service/src/test/java/ch/epfl/autograde/config/properties/MoodleConfigPropertiesTest.java index 52ff481e84b0ffa6a51a4fc4f010ff39b2c2eccb..e6b1e51cf2a27295daa672b72ee9c3ce23a7ba91 100644 --- a/autograde-service/src/test/java/ch/epfl/autograde/config/properties/MoodleConfigPropertiesTest.java +++ b/autograde-service/src/test/java/ch/epfl/autograde/config/properties/MoodleConfigPropertiesTest.java @@ -1,5 +1,6 @@ package ch.epfl.autograde.config.properties; +import ch.epfl.autograde.properties.MoodleConfigProperties; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/autograde-submission-manager/pom.xml b/autograde-submission-manager/pom.xml index 153207366036630619e875c5ad4f123d8559460d..1796d05ffdb434f46fcd85e5c02c9303dc37c235 100644 --- a/autograde-submission-manager/pom.xml +++ b/autograde-submission-manager/pom.xml @@ -6,7 +6,7 @@ <groupId>ch.epfl.autograde</groupId> <artifactId>autograde-submission-manager</artifactId> - <version>1.0.3</version> + <version>1.0.4</version> <properties> <maven.compiler.source>17</maven.compiler.source> diff --git a/moodle-assignsubmission-autograde/version.php b/moodle-assignsubmission-autograde/version.php index 31e58f6811cde541072124c7307e642f1b672ad7..68902707e54e67603e083c5117d680cbc938c624 100644 --- a/moodle-assignsubmission-autograde/version.php +++ b/moodle-assignsubmission-autograde/version.php @@ -25,10 +25,10 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2024103100; // HR : October 31st, 2024 +$plugin->version = 2024110400; // HR : November 4th, 2024 $plugin->requires = 2022112800; // HR : Moodle 4.1.0 (https://moodledev.io/general/releases#moodle-41-lts) $plugin->maturity = MATURITY_STABLE; -$plugin->release = '1.0.2'; +$plugin->release = '1.0.4'; $plugin->component = 'assignsubmission_autograde'; $plugin->dependencies = array( 'mod_assign' => '2022112800', diff --git a/pom.xml b/pom.xml index 1414c7ad643042d37307321f33e025351efda074..94f2c93398445a44c40e8cbcc1bfd8bf1200d80a 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ <!-- HR : Project definition--> <groupId>ch.epfl.autograde</groupId> <artifactId>autograde</artifactId> - <version>1.0.3</version> + <version>1.0.4</version> <name>autograde</name> <packaging>pom</packaging>