On 12/15/2012 07:00 PM, Ivana Hutarova Varekova wrote:
> Template cgroups mean control groups which are set in cgrules.conf file and
> the name contains % variable like %U (see cgrules.conf manual page for the
> whole list of variables).
>
> This patch tunes cgconfigparser to accept template tag. With this patch the
> tag is
> accepted and ignored. The next patch will parse it and do relevant work.
>
> Example:
> template student/%u {
> cpu {
> cpu.shares = "1000";
> }
> }
>
> Signed-off-by: Ivana Hutarova Varekova <[email protected]>
Acked-by: Jan Safranek<[email protected]>
> ---
>
> src/config.c | 37 +++++++++++++
> src/lex.l | 3 +
> src/libcgroup-internal.h | 5 ++
> src/parse.y | 136
> ++++++++++++++++++++++++++++++++++++++++++++++
> 4 files changed, 179 insertions(+), 2 deletions(-)
>
> diff --git a/src/config.c b/src/config.c
> index fd25c9d..59b3383 100644
> --- a/src/config.c
> +++ b/src/config.c
> @@ -123,6 +123,16 @@ int cgroup_config_insert_cgroup(char *cg_name)
> }
>
> /*
> + * TODO: This call just sets the name of the template. It will
> + * always be called in the end, because the parser will
> + * work bottom up.
> + */
> +int template_config_insert_cgroup(char *cg_name)
> +{
> + return 1;
> +}
> +
> +/*
> * This function sets the various controller's control
> * files. It will always append values for cgroup_table_index
> * entry in the cgroup_table. The index is incremented in
> @@ -180,6 +190,17 @@ parse_error:
> return 0;
> }
>
> +/* TODO: This function sets the various controller's control
> + * files. It will always append values for config_template_table_index
> + * entry in the config_template_table. The index is incremented in
> + * temlate_config_insert_cgroup
> + */
> +int template_config_parse_controller_options(char *controller,
> + struct cgroup_dictionary *values)
> +{
> + return 1;
> +}
> +
> /*
> * Sets the tasks file's uid and gid
> */
> @@ -254,6 +275,14 @@ group_task_error:
> }
>
> /*
> + * TODO: Sets the tasks file's uid and gid for templates
> + */
> +int template_config_group_task_perm(char *perm_type, char *value)
> +{
> + return 1;
> +}
> +
> +/*
> * Set the control file's uid/gid
> */
> int cgroup_config_group_admin_perm(char *perm_type, char *value)
> @@ -335,6 +364,14 @@ admin_error:
> }
>
> /*
> + * TODO: Set the control file's uid and gid for templates
> + */
> +int template_config_group_admin_perm(char *perm_type, char *value)
> +{
> + return 1;
> +}
> +
> +/*
> * The moment we have found the controller's information
> * insert it into the config_mount_table.
> */
> diff --git a/src/lex.l b/src/lex.l
> index 9ff37ec..d47807b 100644
> --- a/src/lex.l
> +++ b/src/lex.l
> @@ -39,8 +39,9 @@ jmp_buf parser_error_env;
> "perm" {return PERM;}
> "group" {return GROUP;}
> "namespace" {return NAMESPACE;}
> +"template" {return TEMPLATE;}
> "default" {return DEFAULT;}
> -[a-zA-Z0-9_\-\/\.\,]+ {yylval.name = strdup(yytext); return ID;}
> +[a-zA-Z0-9_\-\/\.\,\%]+ {yylval.name = strdup(yytext); return ID;}
> \"[^"]*\" {yylval.name = strdup(yytext+1);
> yylval.name[strlen(yylval.name)-1] = '\0'; return ID; }
> . {return yytext[0];}
> %%
> diff --git a/src/libcgroup-internal.h b/src/libcgroup-internal.h
> index 8bcfd96..e59a59e 100644
> --- a/src/libcgroup-internal.h
> +++ b/src/libcgroup-internal.h
> @@ -220,6 +220,11 @@ extern __thread char
> *cg_namespace_table[CG_CONTROLLER_MAX];
> int cgroup_config_insert_cgroup(char *cg_name);
> int cgroup_config_parse_controller_options(char *controller,
> struct cgroup_dictionary *values);
> +int template_config_insert_cgroup(char *cg_name);
> +int template_config_parse_controller_options(char *controller,
> + struct cgroup_dictionary *values);
> +int template_config_group_task_perm(char *perm_type, char *value);
> +int template_config_group_admin_perm(char *perm_type, char *value);
> int cgroup_config_group_task_perm(char *perm_type, char *value);
> int cgroup_config_group_admin_perm(char *perm_type, char *value);
> int cgroup_config_insert_into_mount_table(char *name, char *mount_point);
> diff --git a/src/parse.y b/src/parse.y
> index 7cc444c..f51332c 100644
> --- a/src/parse.y
> +++ b/src/parse.y
> @@ -37,7 +37,7 @@ int yywrap(void)
>
> %}
>
> -%token ID MOUNT GROUP PERM TASK ADMIN NAMESPACE DEFAULT
> +%token ID MOUNT GROUP PERM TASK ADMIN NAMESPACE DEFAULT TEMPLATE
>
> %union {
> char *name;
> @@ -50,6 +50,9 @@ int yywrap(void)
> %type <val> admin_conf task_conf task_or_admin group_conf group start
> %type <val> namespace namespace_conf default default_conf
> %type <values> namevalue_conf
> +%type <val> template template_conf
> +%type <val> template_task_or_admin template_task_namevalue_conf
> +%type <val> template_admin_namevalue_conf
> %start start
> %%
>
> @@ -69,6 +72,10 @@ start : start group
> {
> $$ = $1;
> }
> + | start template
> + {
> + $$ = $1;
> + }
> |
> {
> $$ = 1;
> @@ -146,6 +153,86 @@ group_conf
> }
> ;
>
> +template : TEMPLATE ID '{' template_conf '}'
> + {
> + $$ = $4;
> + if ($$) {
> + $$ = template_config_insert_cgroup($2);
> + if (!$$) {
> + fprintf(stderr, "parsing failed at line number
> %d\n",
> + line_no);
> + $$ = ECGOTHER;
> + return $$;
> + }
> + } else {
> + fprintf(stderr, "parsing failed at line number %d\n",
> + line_no);
> + $$ = ECGCONFIGPARSEFAIL;
> + return $$;
> + }
> + }
> + ;
> +
> +
> +template_conf
> + : ID '{' namevalue_conf '}'
> + {
> + $$ = template_config_parse_controller_options($1, $3);
> + cgroup_dictionary_free($3);
> + if (!$$) {
> + fprintf(stderr, "parsing failed at line number %d\n",
> + line_no);
> + $$ = ECGCONFIGPARSEFAIL;
> + return $$;
> + }
> + }
> + | template_conf ID '{' namevalue_conf '}'
> + {
> + $$ = template_config_parse_controller_options($2, $4);
> + cgroup_dictionary_free($4);
> + if (!$$) {
> + fprintf(stderr, "parsing failed at line number %d\n",
> + line_no);
> + $$ = ECGCONFIGPARSEFAIL;
> + return $$;
> + }
> + }
> + | PERM '{' template_task_or_admin '}'
> + {
> + $$ = $3;
> + if (!$$) {
> + fprintf(stderr, "parsing failed at line number %d\n",
> + line_no);
> + $$ = ECGCONFIGPARSEFAIL;
> + return $$;
> + }
> + }
> + ;
> +
> +template_task_or_admin
> + : TASK '{' template_task_namevalue_conf '}' admin_conf
> + {
> + $$ = $3 && $5;
> + if (!$$) {
> + fprintf(stderr, "parsing failed at line number %d\n",
> + line_no);
> + $$ = ECGCONFIGPARSEFAIL;
> + return $$;
> + }
> + }
> + | ADMIN '{' template_admin_namevalue_conf '}' task_conf
> + {
> + $$ = $3 && $5;
> + if (!$$) {
> + fprintf(stderr, "parsing failed at line number %d\n",
> + line_no);
> + $$ = ECGCONFIGPARSEFAIL;
> + return $$;
> + }
> + }
> + ;
> +
> +
> namevalue_conf
> : ID '=' ID ';'
> {
> @@ -227,6 +314,53 @@ admin_namevalue_conf
> }
> ;
>
> +template_task_namevalue_conf
> + : ID '=' ID ';'
> + {
> + $$ = template_config_group_task_perm($1, $3);
> + if (!$$) {
> + fprintf(stderr, "parsing failed at line number %d\n",
> + line_no);
> + $$ = ECGCONFIGPARSEFAIL;
> + return $$;
> + }
> + }
> + | task_namevalue_conf ID '=' ID ';'
> + {
> + $$ = $1 && template_config_group_task_perm($2, $4);
> + if (!$$) {
> + fprintf(stderr, "parsing failed at line number %d\n",
> + line_no);
> + $$ = ECGCONFIGPARSEFAIL;
> + return $$;
> + }
> + }
> + ;
> +
> +template_admin_namevalue_conf
> + : ID '=' ID ';'
> + {
> + $$ = template_config_group_admin_perm($1, $3);
> + if (!$$) {
> + fprintf(stderr, "parsing failed at line number %d\n",
> + line_no);
> + $$ = ECGCONFIGPARSEFAIL;
> + return $$;
> + }
> + }
> + | admin_namevalue_conf ID '=' ID ';'
> + {
> + $$ = $1 && template_config_group_admin_perm($2, $4);
> + if (!$$) {
> + fprintf(stderr, "parsing failed at line number %d\n",
> + line_no);
> + $$ = ECGCONFIGPARSEFAIL;
> + return $$;
> + }
> + }
> + ;
> +
> +
> task_or_admin
> : TASK '{' task_namevalue_conf '}' admin_conf
> {
>
>
> ------------------------------------------------------------------------------
> LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
> Remotely access PCs and mobile devices and provide instant support
> Improve your efficiency, and focus on delivering more value-add services
> Discover what IT Professionals Know. Rescue delivers
> http://p.sf.net/sfu/logmein_12329d2d
> _______________________________________________
> Libcg-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/libcg-devel
>
------------------------------------------------------------------------------
LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
Remotely access PCs and mobile devices and provide instant support
Improve your efficiency, and focus on delivering more value-add services
Discover what IT Professionals Know. Rescue delivers
http://p.sf.net/sfu/logmein_12329d2d
_______________________________________________
Libcg-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libcg-devel